systemd-palveluiden hallinta ja unit-tiedostojen kirjoittaminen
Ohjaa palveluita systemctlillä ja kirjoita mukautettuja unit- ja ajastintiedostoja skriptattaville daemon-palveluille.
systemd-palveluiden hallinta ja unit-tiedostojen kirjoittaminen on ilmainen Linux-komentorivin ja Bash-komentosarjojen hallinta-oppitunti CoddyKitissä. Tämä on oppitunti 2/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Linux-komentorivin ja Bash-komentosarjojen hallinta-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Linux-komentorivin ja Bash-komentosarjojen hallinta-kurssilla on yhteensä 4 oppituntia.
systemd:n ja systemctl:n esittely
systemd on useimpien nykyaikaisten Linux-jakeluiden init-järjestelmä ja palveluiden hallintaohjelmisto. Se vastaa järjestelmäpalveluiden käynnistämisestä, pysäyttämisestä ja hallinnasta sekä käynnistysprosessien ja järjestelmän tilan käsittelystä.
Ensisijainen työkalu systemd:n kanssa toimimiseen on systemctl. Sen avulla voitte:
- käynnistää ja pysäyttää palveluita
- ottaa palveluita käyttöön tai poistaa niitä käytöstä käynnistyksen yhteydessä
- tarkastella palveluiden tilaa ja lokeja
- ladata asetukset uudelleen ilman uudelleenkäynnistystä
Kaikki systemd:n hallitsemat palvelut määritellään unit-tiedostoissa, jotka ovat deklaratiivisia asetustiedostoja. Ne sijaitsevat hakemistossa /etc/systemd/system/ (koko järjestelmän laajuiset asetukset) tai hakemistossa ~/.config/systemd/user/ (käyttäjäkohtaiset asetukset).
Keskeiset systemctl-komennot
Nämä ovat yleisimmin käytetyt systemctl-komennot palveluiden päivittäiseen hallintaan. Jokainen komento käsittelee yksikön nimeä, kuten nginx.service tai yksinkertaisesti nginx.
systemctl start <unit>— käynnistää palvelun välittömästisystemctl stop <unit>— pysäyttää käynnissä olevan palvelunsystemctl restart <unit>— pysäyttää palvelun ja käynnistää sen sitten uudelleen (täydellinen uudelleenkäynnistys)systemctl reload <unit>— lähettää SIGHUP-signaalin asetusten lataamiseksi uudelleen ilman pysäytystäsystemctl enable <unit>— luo symboliset linkit, jotta yksikkö käynnistyy järjestelmän käynnistyessäsystemctl disable <unit>— poistaa kyseiset symboliset linkitsystemctl status <unit>— näyttää tilan, PID-tunnisteen ja viimeisimmät lokirivit
#!/usr/bin/env bash
# Quick reference: inspect and control an nginx service
# (Requires nginx to be installed; run as root or with sudo)
systemctl status nginx
systemctl start nginx
systemctl enable nginx
systemctl reload nginx
systemctl restart nginx
systemctl stop nginx
systemctl disable nginxPalvelun tilan tarkistaminen yksityiskohtaisesti
systemctl status näyttää yksiköstä kattavan tilannekuvan. Tulosteen ymmärtäminen on olennaista ongelmien nopeassa diagnosoinnissa.
- Loaded: yksikkötiedoston polku ja tieto siitä, onko yksikkö käytössä järjestelmän käynnistyessä
- Active: nykyinen tila —
active (running),inactive (dead),failed - Main PID: palvelun pääprosessin prosessitunniste
- CGroup: kaikki palveluun kuuluvat aliprosessit
- Log lines: tämän yksikön viimeisimmät journal-merkinnät
Voitte myös kysellä pelkän aktiivisen tilan komennolla systemctl is-active ja käyttöönottotilan komennolla systemctl is-enabled. Ne sopivat erityisen hyvin skripteissä käytettäviksi.
#!/usr/bin/env bash
# Script-friendly service health check
SERVICE="sshd"
if systemctl is-active --quiet "$SERVICE"; then
echo "$SERVICE is running."
else
echo "$SERVICE is NOT running. Attempting restart..."
systemctl restart "$SERVICE"
fi
if systemctl is-enabled --quiet "$SERVICE"; then
echo "$SERVICE is enabled at boot."
else
echo "WARNING: $SERVICE is not enabled at boot."
fiYksiköiden luetteloiminen ja suodattaminen
Kun hallittavana on useita palveluita, tarvitsette tehokkaita tapoja yksiköiden luetteloimiseen ja suodattamiseen. systemctl list-units näyttää kaikki tällä hetkellä ladatut yksiköt, kun taas list-unit-files näyttää kaikki asennetut yksikkötiedostot ja niiden käyttöönottotilan.
Hyödyllisiä suodatusasetuksia:
--type=service— näyttää vain palveluyksiköt--state=failed— näyttää vain epäonnistuneet yksiköt--state=active— näyttää vain aktiiviset yksiköt--all— sisällyttää passiiviset yksiköt luetteloon
Kun yhdistätte nämä suodattimet komentoon grep, voitte rakentaa tehokkaita tarkistusputkia ylläpitoskripteihin.
#!/usr/bin/env bash
# List all failed services and report them
echo "=== Failed Services ==="
systemctl list-units --type=service --state=failed --no-legend
echo ""
echo "=== Services Enabled at Boot ==="
systemctl list-unit-files --type=service --state=enabled --no-legend | awk '{print $1}'systemd-palveluyksikkötiedoston rakenne
Palveluyksikkötiedosto on osioista koostuva pelkkä tekstitiedosto INI-tyyliin. Kukin osio hallitsee yksikön elinkaaren eri osa-aluetta.
- [Unit] — metatiedot: kuvaus ja suoritusjärjestyksen riippuvuudet (
After=,Requires=,Wants=) - [Service] — miten prosessi käynnistetään ja pysäytetään:
ExecStart,ExecStop,Restart,User,WorkingDirectory - [Install] — milloin tämä yksikkö otetaan käyttöön:
WantedBy=multi-user.targettarkoittaa, että se aktivoidaan normaalin monen käyttäjän käynnistyksen aikana
Kun olette sijoittaneet yksikkötiedoston hakemistoon /etc/systemd/system/ tai muokanneet sitä siellä, suorittakaa systemctl daemon-reload, jotta systemd ottaa muutokset käyttöön.
Ensimmäisen palveluyksikkötiedoston kirjoittaminen
Luodaan yksinkertainen palveluyksikkötiedosto mukautetulle Python-HTTP-palvelinskriptille. Yksikkötiedosto kertoo systemd:lle täsmällisesti, miten tätä prosessia hallitaan aivan kuten mitä tahansa muuta järjestelmäpalvelua.
Tässä käytetyt tärkeät [Service]-direktiivit:
Type=simple— systemd käsitteleeExecStart-prosessia pääprosessinaUser=www-data— suoritetaan ei-root-käyttäjätilillä turvallisuuden parantamiseksiWorkingDirectory— määrittää prosessin työskentelyhakemistonRestart=on-failure— käynnistää prosessin automaattisesti uudelleen, jos se päättyy nollasta poikkeavaan paluuarvoonRestartSec=5— odottaa uudelleenkäynnistysyritysten välillä 5 sekuntia
#!/usr/bin/env bash
# Create a custom service unit file for a simple HTTP server
# Run as root
cat > /etc/systemd/system/mywebserver.service << 'EOF'
[Unit]
Description=My Custom Python Web Server
After=network.target
[Service]
Type=simple
User=www-data
WorkingDirectory=/var/www/mysite
ExecStart=/usr/bin/python3 -m http.server 8080
Restart=on-failure
RestartSec=5
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now mywebserver.service
systemctl status mywebserver.servicePalvelutyypit ja prosessin elinkaari
[Service]-osion Type=-direktiivi kertoo systemd:lle, miten seurataan palvelun käynnistymisen valmistumista. Väärän tyypin valitseminen aiheuttaa usein suoritusjärjestykseen liittyviä virheitä.
Type=simple— oletus; systemd katsoo palvelun käynnistyneen heti, kunExecStartkäynnistyy. Valmiussignaalia ei tarvita.Type=forking—ExecStart-prosessi haarautuu ja päättyy; varsinainen daemon-prosessi jatkaa aliprosessina. Käyttäkää asetustaPIDFile=, jotta systemd voi seurata sitä.Type=notify— prosessi lähettää ilmoituksensd_notify(READY=1), kun se on todella valmis. Tämä on luotettavin vaihtoehto monimutkaisille daemoneille.Type=oneshot— suoritetaan kerran ja päättyy; seuraavat yksiköt odottavat valmistumista. Sopii erinomaisesti alustusskripteille.Type=idle— kuten simple, mutta suoritus viivästyy, kunnes kaikki aktiiviset työt ovat päättyneet.
#!/usr/bin/env bash
# Example: oneshot service for a database migration script
# /etc/systemd/system/db-migrate.service
cat > /etc/systemd/system/db-migrate.service << 'EOF'
[Unit]
Description=Run Database Migrations
After=postgresql.service
Requires=postgresql.service
[Service]
Type=oneshot
User=appuser
WorkingDirectory=/opt/myapp
ExecStart=/opt/myapp/scripts/migrate.sh
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl start db-migrate.serviceYmpäristömuuttujat ja turvallisuuden vahvistaminen
Palveluyksikkötiedostot tukevat useita direktiivejä ympäristömuuttujien välittämiseen ja turvallisuusrajoitusten käyttöönottoon — molemmat ovat tärkeitä tuotantojärjestelmissä.
Ympäristödirektiivit:
Environment="KEY=value"— asettaa yhden muuttujan suoraan määritykseenEnvironmentFile=/etc/myapp/env— lataa muuttujat tiedostosta (yksiKEY=valuekullakin rivillä)
Yleisiä turvallisuutta vahvistavia direktiivejä:
NoNewPrivileges=true— estää prosessia hankkimasta lisäoikeuksia setuid-mekanismin kauttaProtectSystem=strict— liittää hakemistot/usr,/bootja/etcvain luku -tilaanPrivateTmp=true— antaa palvelulle oman eristetyn/tmp-hakemistonCapabilityBoundingSet=— poistaa käytöstä kaikki Linuxin capability-oikeudet
#!/usr/bin/env bash
# Hardened service unit with environment file
cat > /etc/systemd/system/secureapp.service << 'EOF'
[Unit]
Description=Secure Application Daemon
After=network.target
[Service]
Type=simple
User=secureapp
Group=secureapp
WorkingDirectory=/opt/secureapp
EnvironmentFile=/etc/secureapp/env
ExecStart=/opt/secureapp/bin/server
Restart=on-failure
RestartSec=10
# Security hardening
NoNewPrivileges=true
ProtectSystem=strict
ProtectHome=true
PrivateTmp=true
CapabilityBoundingSet=
ReadWritePaths=/var/lib/secureapp /var/log/secureapp
[Install]
WantedBy=multi-user.target
EOF
# Create the environment file separately so secrets stay out of the unit file
install -m 600 -o secureapp /dev/null /etc/secureapp/env
echo 'APP_PORT=9000' >> /etc/secureapp/env
echo 'DB_URL=postgresql://localhost/mydb' >> /etc/secureapp/env
systemctl daemon-reloadJohdatus systemd-ajastinyksiköihin
systemd-ajastin on yksikkö, joka aktivoi toisen yksikön (yleensä .service-yksikön) aikataulun mukaan. Se korvaa perinteiset cron-työt integroidummalla, lokitettavalla ja hallittavalla mekanismilla.
Jokaiseen ajastinyksikköön (foo.timer) liittyy samanniminen palveluyksikkö (foo.service), joka tekee varsinaisen työn. Käyttöön otetaan ja käynnistetään ajastin, ei palvelua suoraan.
Ajastintyypit:
- Reaaliaikaiset (kalenteri-)ajastimet — käynnistyvät kellonaikoina käyttäen
OnCalendar=-lausekkeita, kutendaily,weeklytaiMon *-*-* 02:00:00 - Monotoniset ajastimet — käynnistyvät suhteessa järjestelmätapahtumaan käyttäen asetusta
OnBootSec=,OnActiveSec=taiOnUnitActiveSec=
Ajastinyksikkötiedoston kirjoittaminen
Rakennetaan täydellinen ajastin- ja palvelupari, joka suorittaa varmuuskopiointiskriptin päivittäin kello 02.00. Huomaatte, että [Timer]-osio on omassa .timer-tiedostossaan, kun taas varsinainen työ määritellään siihen liittyvässä .service-tiedostossa.
Tärkeät [Timer]-direktiivit:
OnCalendar=— aikataulun kalenterilausekePersistent=true— jos järjestelmä oli sammutettuna ajastimen määräaikana, tehtävä suoritetaan heti seuraavan käynnistyksen yhteydessäRandomizedDelaySec=— lisää enintään N sekunnin satunnaisen viiveen, jotta monet samaa aikataulua käyttävät palvelimet eivät kuormita järjestelmää yhtä aikaaUnit=— nimenomaisesti määritetty kohdeyksikkö (valinnainen, jos nimet täsmäävät)
#!/usr/bin/env bash
# Create a daily backup timer pair
# Run as root
# 1. The service that does the work
cat > /etc/systemd/system/daily-backup.service << 'EOF'
[Unit]
Description=Daily Database Backup
After=network.target postgresql.service
[Service]
Type=oneshot
User=backup
ExecStart=/usr/local/bin/backup-db.sh
StandardOutput=journal
StandardError=journal
EOF
# 2. The timer that schedules it
cat > /etc/systemd/system/daily-backup.timer << 'EOF'
[Unit]
Description=Run Daily Database Backup at 02:00
[Timer]
OnCalendar=*-*-* 02:00:00
Persistent=true
RandomizedDelaySec=300
[Install]
WantedBy=timers.target
EOF
systemctl daemon-reload
systemctl enable --now daily-backup.timer
# Verify
systemctl list-timers daily-backup.timerLokien tarkasteleminen ja yksiköiden vianmääritys
systemd ohjaa kaiken palveluiden tulosteen journaliin, jota kysellään komennolla journalctl. Tämä kokoaa kaikkien yksiköiden lokit yhteen haettavaan tietovarastoon.
Keskeiset journalctl-valitsimet palveluiden vianmääritykseen:
-u <unit>— suodattaa yksikön nimen perusteella-f— seuraa lokia reaaliajassa (kutentail -f)-n 50— näyttää vain 50 viimeistä riviä--since "1 hour ago"— rajaa ajan perusteella-p err— näyttää vain virhetasoiset ja sitä vakavammat merkinnät-b— näyttää vain nykyisen käynnistyskerran lokit
Kun yksikön käynnistys epäonnistuu, suorittakaa ensin journalctl -u <unit> -n 30 --no-pager ja sen jälkeen systemctl status <unit>, jotta saatte viimeisimmän virhekontekstin näkyviin.
#!/usr/bin/env bash
# Troubleshooting helper: dump unit status and recent logs
# Usage: ./service-debug.sh <unit-name>
UNIT="${1:-nginx.service}"
echo "=============================="
echo "STATUS: $UNIT"
echo "=============================="
systemctl status "$UNIT" --no-pager -l
echo ""
echo "=============================="
echo "RECENT LOGS (last 50 lines): $UNIT"
echo "=============================="
journalctl -u "$UNIT" -n 50 --no-pager
echo ""
echo "=============================="
echo "ERRORS ONLY (current boot)"
echo "=============================="
journalctl -u "$UNIT" -b -p err --no-pagerTietotesti: systemd-yksikkötiedostot
Testatkaa ymmärrystänne systemd-palveluiden ja ajastinyksiköiden määrityksestä.
Oppitunnin yhteenveto: systemd-palveluiden hallinta ja yksikkötiedostojen kirjoittaminen
Tässä oppitunnissa tutustuitte systemd-palveluiden hallinnan ja yksikkötiedostojen kirjoittamisen keskeisiin käsitteisiin ammattilaistasolla. Tässä on yhteenveto käsitellyistä aiheista:
- systemctl-perusteet — start, stop, restart, reload, enable, disable, status, is-active ja is-enabled skripteihin sopivia tarkistuksia varten
- Luetteloiminen ja suodattaminen —
list-unitsjalist-unit-filessekä valitsimet--typeja--stateepäonnistuneiden tai käytössä olevien palveluiden eristämiseen - Yksikkötiedoston rakenne — kolme osiota
[Unit],[Service]ja[Install]sekä niiden tärkeimmät direktiivit - Palvelutyypit —
simple,forking,notifyjaoneshotsekä kunkin käyttötilanteet - Ympäristö ja turvallisuus —
EnvironmentFile,NoNewPrivileges,ProtectSystemjaPrivateTmpvahvistettuja daemoneita varten - Ajastinyksiköt —
.timer- ja.service-tiedostojen yhdistäminen,OnCalendar-lausekkeet jaPersistent-asetuksen avulla tehtävä myöhästyneiden suoritusten käsittely - Journalctl — suodattaminen yksikön, ajan, käynnistyskerran ja prioriteetin perusteella vikatilanteiden tehokasta diagnosointia varten
Näillä taidoilla voitte hallita mitä tahansa järjestelmäpalvelua, ajoittaa toistuvia tehtäviä luotettavasti ja kirjoittaa tuotantokelpoisia yksikkötiedostoja omille daemoneillenne.
Opi Bash tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 22
- Oppitunnit
- 88
Usein kysytyt kysymykset
Onko oppitunti ”systemd-palveluiden hallinta ja unit-tiedostojen kirjoittaminen” ilmainen?
Kyllä – oppitunnin ”systemd-palveluiden hallinta ja unit-tiedostojen kirjoittaminen” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Linux-komentorivin ja Bash-komentosarjojen hallinta-kurssin, päivitä CoddyKit PROhon. Linux-komentorivin ja Bash-komentosarjojen hallinta-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”systemd-palveluiden hallinta ja unit-tiedostojen kirjoittaminen”?
Ohjaa palveluita systemctlillä ja kirjoita mukautettuja unit- ja ajastintiedostoja skriptattaville daemon-palveluille. Harjoittelet Linux-komentorivin ja Bash-komentosarjojen hallinta-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni Linux-komentorivin ja Bash-komentosarjojen hallinta-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin Linux-komentorivin ja Bash-komentosarjojen hallinta-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 2/4.
Kuinka kauan ”systemd-palveluiden hallinta ja unit-tiedostojen kirjoittaminen”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä Linux-komentorivin ja Bash-komentosarjojen hallinta-oppitunnilla?
Kyllä. Jokainen Linux-komentorivin ja Bash-komentosarjojen hallinta-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- Käyttäjien ja ryhmien luonnin automatisointi
- systemd-palveluiden hallinta ja unit-tiedostojen kirjoittaminen
- Levyjen, tiedostojärjestelmien ja liitosten automatisointi
- Järjestelmän kuntotarkistus- ja hälytysskriptien rakentaminen