Přečetl jsem si, co je multi-user.target a dokumentaci systemd, která uvádí, že multi-user.target je speciální cíl. Navíc tento řádek obsahuje mnoho příkladů systemd.
- Proč tolik vzorových služeb obsahuje tento řádek?
- Co by se stalo, kdyby neobsahovaly WantedBy=multi-user.target?
- Mohl byste mi uvést příklad, kdy by bylo skutečně vhodné tento řádek nezahrnout do definice souboru služby?
- Podobně, kdy je dobré tuto linii zachovat?
Přijatá odpověď:
1.) multi-user.target
je v podstatě nejbližší ekvivalent klasického běhu SysVinit 3, který systemd
má. Když systemd
systém se spustí, systemd
se snaží, aby stav systému odpovídal stavu určenému default.target
– což je obvykle alias pro graphical.target
nebo multi-user.target
.
multi-user.target
obvykle definuje stav systému, kdy jsou spuštěny všechny síťové služby a systém bude přijímat přihlášení, ale není spuštěno místní GUI. Toto je typický výchozí stav systému pro serverové systémy, což mohou být bezhlavé systémy namontované v racku ve vzdálené serverové místnosti.
graphical.target
je další možný alias pro default.target
. Normálně je definován jako nadmnožina multi-user.target
:zahrnuje vše multi-user.target
ano, plus aktivace místního přihlášení do GUI. Takže něco jako runlevel 5 v klasickém SysVinit.
Řádek WantedBy=multi-user.target
ve službě je v podstatě totéž jako zadání „tato služba by se měla spustit na úrovních 3, 4 a 5“ v systémech SysVinit:říká to systemd
že tato služba by měla být spuštěna jako součást normálního spouštění systému bez ohledu na to, zda je aktivní místní grafické uživatelské rozhraní.
Nicméně WantedBy
je oddělená od stavu zapnuto/vypnuto:takže v jiném smyslu je to něco jako „přednastavení“:určuje, za jakých podmínek může dojít k automatickému spuštění, ale pouze tehdy, když je služba povolena.
2.) pokud vynecháte WantedBy=multi-user.target
linka a žádná jiná povolená služba neobsahuje Requires=your.service
nebo Wants=your.service
v definici služby se vaše služba nespustí automaticky.
systemd
funguje na závislostech a při spouštění, pokud nic Requires
nebo Wants
vaši službu, nespustí se, i když je služba povolena.
Jistě, můžete upravit svůj default.target
přidat nebo odstranit Requires
nebo Wants
řádky pro všechny služby, které chcete spustit při spouštění – ale abyste mohli do systému vložit nový soubor služby a nechat jej pracovat ve výchozím nastavení (což velmi usnadňuje správcům softwarových balíčků), systemd
má WantedBy
a RequiredBy
klíčová slova, která lze použít k vložení Wants
a Requires
-typové závislosti (respektive) z „druhého konce“.
3.) Pokud neděláte, měli byste řádek vynechat chcete, aby se služba vždy spouštěla automaticky při spouštění, nebo tato služba je součástí řetězce závislostí, které jste explicitně definovali.
Můžete například refaktorovat serverovou aplikaci A a z nějakého důvodu se rozhodnete rozdělit některé volitelné funkce z ní na samostatnou službu B, abyste uživateli umožnili volbu neinstalovat ji, pokud to není potřeba. Pak byste mohli ze služby B udělat samostatnou service-B.rpm
a definujte B.service
s WantedBy=A.service
vytvořit systemd
spustit službu B automaticky při každém spuštění služby A – ale pouze když service-B.rpm
je skutečně nainstalován.
Všimněte si, že Wants
nebo WantedBy
pouze říká, že systém by měl spustit jednu službu vždy, když je také spuštěna jiná služba nebo cíl, ale neurčuje vůbec nic o pořadí spouštění/vypínání. Pokud potřebujete, aby služba B byla již spuštěna při spuštění služby A, musíte přidat Before=A.service
v B.service
soubor explicitně specifikovat závislost pořadí spouštění.
4.) Kdykoli uděláte chcete, aby služba měla možnost automatického spouštění při spouštění a aby nebyly definovány žádné další závislosti.