GNU/Linux >> Znalost Linux >  >> Linux

Správná náhrada Rc.local v Systemd místo opětovného vytvoření Rc.local?

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 .

  1. 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í).
  2. 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.

  1. Musíte to povolit pomocí systemctl enable my-startup.service .

  2. 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 řádky Wants=network-online.target a After=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 jako my-startup.service jsou automaticky seřazeny po basic.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ím systemctl list-dependencies --after basic.target . (Všimněte si, že je to --after , nikoli --before ).

Související:Spustit skript znovu, pokud je vstup ano?

Existuje několik úvah, které se podle mého názoru vztahují také na předsystémové rc.local :

  1. Musíte se ujistit, že vaše příkazy nejsou v konfliktu s jiným programem, který se pokouší ovládat stejnou věc.
  2. 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.


Linux
  1. 10 praktických příkazů systemd:Reference

  2. Která služba Systemd spouští textovou konzoli na zařízení Framebuffer?

  3. Linux – Jak nastavit výchozí afinitu CPU pro všechny démony v Systemd?

  1. Jak nastavit hodnoty ulimit pro službu systemd

  2. Jaký je správný způsob, jak spustit službu mongod na linux / OS X?

  3. Jak zastavit službu systemd

  1. Použití proměnné v cestě příkazu pro ExecStart ve službě systemd

  2. Jaký je nejsprávnější bod připojení pro trvalý oddíl NTFS?

  3. pomocí časovačů systemd místo cronu