Nemohu najít správný způsob, jak spustit nějaké místní skripty (nebo velmi lokální příkazy) na systemd, už vím, že nesmím vytvářet službu (v systemd jednotku) pro tento druh skriptů (nebo musím?)…
Řešením, které jsem našel, je vytvořit rc.local a dát mu oprávnění ke spuštění.
printf '#!/bin/bash nnexit 0' >/etc/rc.local
chmod +x /etc/rc.local
Například, pokud dostanu starší server s jednoduchým rc.local nakonfigurovaným vámi, budu vědět, co jste udělali a jak moc bude bolet upgradovat nebo nainstalovat něco nového na distro, protože rc.local byl respektován externími balíčky, ale na druhou stranu, když nainstaluji server a vytvořím jednotku systemd nebo dvě nebo tři (nebo dokonce služby sysvinit), jen pro provedení jednoduchého úkolu, může vám to někdy ztížit život a mnohem víc než toto moje jednotky jména mohou být někdy v konfliktu s názvy nových služeb vytvořených vývojem distribuce a možná nainstalovaných při upgradu, což způsobí potíže mým skriptům!
Vidím další otázku dotaz na kde je rc.local a odpovědí bylo vytvořit jej a udělit oprávnění k provedení, myslím, že moje otázka skutečně ne duplikát , protože nechci vědět, kde to je – věřte mi, chci to jen přijmout že je zastaralé , ale nemohu najít správný způsob, jak dělat takové věci, mám opravdu vytvořit jednotku jen pro něco podobného?
Přijatá odpověď:
Jak bylo uvedeno jinde, používání rc-local.service
se stává mírně nečistým pod systemd
.
- Je teoreticky možné, že to vaše distribuce neumožní. (Myslím, že to není běžné, např. protože deaktivace stejné možnosti sestavení také odstraní
poweroff
/reboot
příkazy, které používá mnoho lidí). - Sémantika není zcela jasná. Systemd definuje
rc-local.service
jedním způsobem, ale Debian poskytuje soubor drop-in, který mění alespoň jedno důležité nastavení.
rc-local.service
může často dobře fungovat. Pokud se výše uvedeného obáváte, vše, co musíte udělat, je vytvořit si vlastní kopii! Tady je kouzlo:
# /etc/systemd/system/my-startup.service
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/local/libexec/my-startup-script
[Install]
WantedBy=multi-user.target
Nemyslím si, že musíte rozumět každému detailu[*], ale jsou zde dvě věci, které byste zde měli vědět.
-
Musíte to povolit pomocí
systemctl enable my-startup.service
. -
Pokud je váš skript závislý na jakékoli jiné službě, včetně
network-online.target
, musíte to prohlásit. Např. přidejte[Unit]
sekce s řádkyWants=network-online.target
aAfter=network-online.target
.Nemusíte si dělat starosti se závislostmi na službách „early boot“ – konkrétně na službách, které jsou již objednány před
basic.target
. Služby jakomy-startup.service
jsou automaticky seřazeny pobasic.target
, pokud nenastavíDefaultDependencies=no
.Pokud si nejste jisti, zda je jedna z vašich závislostí službou „předčasného spouštění“, jedním přístupem je uvést služby, které jsou objednány před
basic.target
, spuštěnímsystemctl list-dependencies --after basic.target
. (Všimněte si, že je to--after
, nikoli--before
).
Existuje několik úvah, které se podle mého názoru vztahují také na předsystémové rc.local
:
- Musíte se ujistit, že vaše příkazy nejsou v konfliktu s jiným programem, který se pokouší ovládat stejnou věc.
- Nejlepší je nespouštět dlouhotrvající programy neboli démony z
rc.local
.
[*] Použil jsem Type=oneshot
+ RemainAfterExit=yes
protože to dává větší smysl pro většinu jednorázových skriptů. Formalizuje, že budete spouštět řadu příkazů, které my-startup
se po dokončení zobrazí jako „aktivní“ a že nespustíte démona.