6. modulis · 6.3
Savi pakalpojumi un taimeri
6. modulis: Pakalpojumi un žurnāli · Lasīšanas laiks: 11 min.
Mācīšanās mērķis: Pēc šīs nodarbības Jūs varēsiet palaist savu programmu kā systemd pakalpojumu ar atsevišķu lietotāju un dažām drošības opcijām, kā arī plānot uzdevumus ar systemd taimeri vai cron.
Pamatjēdzieni: unit fails, [Unit], [Service], [Install], ExecStart, User=, WorkingDirectory, EnvironmentFile, Restart=, WantedBy, NoNewPrivileges, ProtectSystem, ProtectHome, PrivateTmp, systemd-analyze security, taimeris, OnCalendar, Persistent, crontab
Kāpēc ne vienkārši "nohup" vai "screen"?
Kad serverī uzliekat savu programmu (nelielu tīmekļa lietotni, botu, skriptu, kas katru nakti kaut ko dara), pirmo reizi to bieži palaižat manuāli: node server.js & vai screen sesijā. Tas darbojas, līdz Jūs atsakāties, serveris tiek restartēts vai programma avarē. Tad tā ir pazudusi, un neviens to nepamana.
Programmai, kurai jādarbojas vienmēr, jābūt systemd pakalpojumam. Tad:
- tā startē automātiski, palaižot sistēmu;
- systemd to palaiž no jauna, ja tā avarē;
- tās izvade nonāk žurnālā (nodarbība 6.2);
- tā darbojas Jūsu izvēlēta lietotāja vārdā, ar tām tiesībām, kuras Jūs atļaujat.
Savs unit fails
Pieņemsim, ka Jums ir neliela Node.js lietotne mapē /opt/factuurapp, kas klausās uz 127.0.0.1:3000. Vēlāk nginx vai Caddy to padarīs pieejamu no ārpuses (modulis 7).
1. solis: atsevišķs lietotājs bez čaulas (nodarbība 3.2). Lietotnei nav jābūt root, un tai nav jāpiesakās:
anna@web1:~$ sudo adduser --system --group --home /opt/factuurapp --no-create-home factuurapp
anna@web1:~$ sudo chown -R factuurapp:factuurapp /opt/factuurapp/dataPats kods var palikt root īpašumā (lietotnei nav jāmaina pašai sevi); dienesta lietotājam pieder tikai mape, kurā tā raksta.
2. solis: unit fails. Savus unit failus ievietojiet mapē /etc/systemd/system/:
# /etc/systemd/system/factuurapp.service
[Unit]
Description=Factuurapp (Node.js)
After=network-online.target
Wants=network-online.target
[Service]
User=factuurapp
Group=factuurapp
WorkingDirectory=/opt/factuurapp
EnvironmentFile=/etc/factuurapp/env
ExecStart=/usr/bin/node /opt/factuurapp/server.js
Restart=on-failure
RestartSec=5s
NoNewPrivileges=true
ProtectSystem=strict
ProtectHome=true
PrivateTmp=true
ReadWritePaths=/opt/factuurapp/data
[Install]
WantedBy=multi-user.targetTrīs bloki:
- [Unit]: apraksts un secība.
After=network-online.targetkopā arWants=nodrošina, ka pakalpojums startē tikai tad, kad tīkls ir pieejams. - [Service]: kā programma darbojas.
ExecStartar pilnu ceļu (systemd neizmanto meklēšanas ceļu kā Jūsu čaula).User=unGroup=nosaka, kura vārdā tā darbojas.EnvironmentFilenolasa iestatījumus, piemēram, datubāzes paroli, no atsevišķa faila, lai tie neatrastos unit failā. - [Install]: ko dara
enable.WantedBy=multi-user.targetnozīmē: startēt līdz ar parastu sistēmas palaišanu.
3. solis: noslēpumi atsevišķi, ar stingrām tiesībām.
anna@web1:~$ sudo mkdir /etc/factuurapp
anna@web1:~$ sudo install -m 600 -o root -g root /dev/null /etc/factuurapp/env
anna@web1:~$ sudoedit /etc/factuurapp/envSaturs, piemēram, DATABASE_URL=postgres://factuur:...@127.0.0.1/factuur. systemd nolasa failu kā root, pirms pārslēdzas uz dienesta lietotāju, tāpēc pietiek ar 600, kas pieder root.
4. solis: ielādēt, startēt, pārbaudīt.
anna@web1:~$ sudo systemctl daemon-reload
anna@web1:~$ sudo systemctl enable --now factuurapp
anna@web1:~$ systemctl status factuurapp
anna@web1:~$ journalctl -u factuurapp -fDrošības opcijas: maza piepūle, liela atšķirība
Četras rindas zem RestartSec piemērā ierobežo, ko pakalpojums var darīt, arī tad, ja kāds atrod ievainojamību Jūsu lietotnē:
| Opcija | Iedarbība |
|---|---|
NoNewPrivileges=true | process un tā bērnprocesi nekad nevar iegūt vairāk tiesību (arī ne ar sudo vai setuid programmām) |
ProtectSystem=strict | visa failu sistēma pakalpojumam ir tikai lasāma, izņemot to, ko atļaujat ar ReadWritePaths= |
ProtectHome=true | /home, /root un /run/user nav redzamas |
PrivateTmp=true | sava, tukša /tmp, ko citas programmas neredz |
systemd var novērtēt Jūsu unit failu:
anna@web1:~$ systemd-analyze security factuurapp
...
→ Overall exposure level for factuurapp.service: 4.9 OK 🙂Jo mazāks skaitlis, jo labāk. Pakalpojums bez opcijām iegūst ap 9 ("UNSAFE"). Nav jātiecas uz nulli: katra pievienotā opcija var sabojāt kaut ko, kas lietotnei vajadzīgs. Pievienojiet tās pa vienai un pārbaudiet pēc katra soļa. Ja kaut kas vairs nedarbojas, iemesls parasti redzams žurnālā ("Read-only file system", "Permission denied").
Uzdevumu plānošana: taimeri
Darbībām, kam jānotiek noteiktos laikos (rezerves kopija, tīrīšanas skripts, atskaite), Jums vajag taimeri. systemd taimeris sastāv no diviem unit failiem ar vienādu nosaukumu: .service, kas nosaka, kam jānotiek, un .timer, kas nosaka, kad.
# /etc/systemd/system/opruimen.service
[Unit]
Description=Oude exportbestanden opruimen
[Service]
Type=oneshot
User=factuurapp
ExecStart=/usr/bin/find /opt/factuurapp/data/export -type f -mtime +30 -delete# /etc/systemd/system/opruimen.timer
[Unit]
Description=Dagelijks oude exportbestanden opruimen
[Timer]
OnCalendar=*-*-* 03:15:00
RandomizedDelaySec=10m
Persistent=true
[Install]
WantedBy=timers.targetType=oneshot nozīmē: programma izpildās un pēc tam ir pabeigta. OnCalendar ir laika grafiks: katru dienu plkst. 03:15. Varat rakstīt arī daily, weekly vai Mon *-*-* 02:00; systemd-analyze calendar "Mon *-*-* 02:00" parāda, kad tas notiks nākamreiz. Persistent=true ir svarīgs: ja serveris plkst. 03:15 bija izslēgts, uzdevums tiek izpildīts uzreiz pēc palaišanas. RandomizedDelaySec nedaudz izkliedē sākuma brīdi.
Ieslēdziet taimeri, nevis service:
anna@web1:~$ sudo systemctl daemon-reload
anna@web1:~$ sudo systemctl enable --now opruimen.timer
anna@web1:~$ systemctl list-timers opruimen
NEXT LEFT LAST PASSED UNIT ACTIVATES
Tue 2026-11-10 03:19:42 CET 15h left - - opruimen.timer opruimen.service
anna@web1:~$ sudo systemctl start opruimen.service # tagad vienreiz pārbaudīt manuāli
anna@web1:~$ journalctl -u opruimen.serviceUn cron?
cron ir vecāks, vienkāršāks rīks, un tas joprojām lieliski darbojas. Rinda lietotāja crontab (crontab -e):
15 3 * * * /usr/local/bin/opruimen.shPieci lauki ir minūte, stunda, mēneša diena, mēnesis un nedēļas diena. Priekšrocības un trūkumi blakus:
| cron | systemd taimeris | |
|---|---|---|
| Iestatīšana | viena rinda | divi faili |
| Izlaista izpilde (serveris izslēgts) | tiek izlaista | ar Persistent=true tiek izpildīta vēlāk |
| Izvade un kļūdas | pa e-pastu, ja serveris var sūtīt e-pastu; citādi pazūd | žurnālā |
| Drošības opcijas, lietotājs | ar pašu skriptu | viss, ko piedāvā systemd (nodarbība iepriekš) |
| Redzēt, kad tas izpildījās | sarežģīti | systemctl list-timers un žurnāls |
Serverim, ko pārvaldāt nopietni, taimeri ir labāka izvēle, īpaši rezerves kopijām (nodarbība 8.2): Jūs vēlaties droši zināt, ka tās izpildījās un ko tās ziņoja. cron rindu, kas klusi neizdodas, Jūs pamanāt tikai tad, kad Jums vajag rezerves kopiju.
AlmaLinux un Rocky Linux sistēmās
Unit faili un taimeri darbojas tieši tāpat. Viena atšķirība: SELinux var bloķēt savu pakalpojumu, kas lasa vai raksta failus vietā, kuru SELinux negaida, vai klausās uz neparasta porta. Paziņojums atrodas /var/log/audit/audit.log. Neizslēdziet SELinux, lai to atrisinātu; atrodiet pareizo etiķeti vai noteikumu (piemēram, ar semanage).
Kopsavilkums
- Programmai, kurai jādarbojas vienmēr, jābūt systemd pakalpojumam: automātiska palaišana, restartēšana pēc avārijas, žurnāli žurnālā.
- Savi unit faili mapē
/etc/systemd/system/, arUser=atsevišķs lietotājs bez čaulas, noslēpumi failāEnvironmentFilear tiesībām 600. NoNewPrivileges,ProtectSystem=strictarReadWritePaths,ProtectHomeunPrivateTmpierobežo kaitējumu ievainojamības gadījumā;systemd-analyze securitynovērtē unit failu.- Taimeris ir
.serviceplus.timerarOnCalendar;Persistent=trueizpilda izlaistās reizes vēlāk. Ieslēdziet taimeri, nevis service. - cron joprojām darbojas, bet taimeri dod labākus žurnālus un neizlaiž izpildes.
Tests (quiz)
Uzdevums
Uzdevums O6.3: Savs pakalpojums ar taimeri. Izveidojiet savā serverī nelielu savu pakalpojumu ar taimeri, piemēram, skriptu, kas katru nakti ieraksta failā vai žurnālā brīvo diska vietu un systemctl --failed. Izmantojiet atsevišķu lietotāju, Type=oneshot, vismaz divas drošības opcijas un Persistent=true. Pārbaudiet ar systemctl start, apskatiet izvadi žurnālā un pierakstiet systemd-analyze security vērtējumu. Ielīmējiet savu .service un .timer un atbildiet uz kontrolsaraksta jautājumiem.
Uzdevums O6.3: Savs pakalpojums ar taimeri
Šo uzdevumu veicat paši; neviens to nepārbauda. Atzīmējiet, ko esat izdarījuši, un atzīmējiet uzdevumu kā paveiktu.
Ar Persistent=true uzdevums tiek izpildīts pēc palaišanas, ja tas tika nokavēts. Rezultāts zem 6 ir labs pirmajam pakalpojumam; rakstīšanas tiesības tikai caur ReadWritePaths.
Jūsu atzīmes un piezīmes paliek tikai šajā pārlūkprogrammā; mēs tās nekur nesūtām. Ja esat pieteikušies, sadaļā Mani kursi saglabājam tikai to, ka uzdevums ir paveikts.
Vairāk lasīt
- DirectAdmin rokasgrāmata 15.1: Cron Jobs: uzdevumus likt izpildīties automātiski
- Rokasgrāmata
systemd.exec(5)(User=, ProtectSystem=, NoNewPrivileges=): https://manpages.debian.org/trixie/systemd/systemd.exec.5.en.html - Rokasgrāmata
systemd.timer(5)(OnCalendar=, Persistent=): https://manpages.debian.org/trixie/systemd/systemd.timer.5.en.html - Rokasgrāmata
systemd.time(7)(laika grafiki): https://manpages.debian.org/trixie/systemd/systemd.time.7.en.html
