Systemd oneshot service a timer

Krátký návod pro vytvoření jednorázové služby, která může sloužit jako mnohem lepší náhrada starého rc.local. A také si ukážeme, jak volat služby v kontejneru nspawn přímo z hostitele.

Service

Do souboru /etc/systemd/system/sluzba.service dáme následující obsah (zde je příklad, který používám pro zálohování databáze PostgreSQL):

[Unit]
Description=PostgreSQL backup

[Service]
Type=oneshot
ExecStart=/usr/bin/bash /root/bin/backup.sh

Kde:

  • Description: popis služby
  • Type: oneshot pro jednorázové služby
  • ExecStart: program, který se spustí

Vhodné jsou i další volby, například User a Group, aby služba běžela s minimálními právy, ideálně pro každou činnost vytvoříme dalšího uživatele, klidně bez hesla a bez možnosti přihlášení (adduser --system).

Službu spustíme:

systemctl daemon-reload
systemctl start sluzba.service

Timer

Pokud máme napsanou a otestovanou službu, můžeme si jednoduše nastavit její pravidelné spouštění a nahradit tím zastaralý cron.

Vytvoříme soubor .timer stejného jména jako má služba a nastavíme:

[Unit]
Description=Backup system every day

[Timer]
OnCalendar=daily
AccuracySec=1h
Persistent=true

[Install]
WantedBy=timers.target

Je třeba jen nastavit WantedBy=timers.target a samozřejmě čas spouštění u kterého můžeme nastavit i přesnost, což umožní systemd naplánovat běh služeb v závislosti na jejich počtu, závislostech a s dalším nastavením i s ohledem na volné prostředky.

Spouštění z hostitele

Služby v nspawn kontejneru lze ovládat i z hostitele systémovým příkazem systemctl -M pg start backup.service, kde -M je parametr udávající název kontejneru. Takto je tedy možné ovládat služby, které běží k kontejnerech přímo z jednoho stroje.

,