GNU/Linux >> Znalost Linux >  >> Linux

Vložit soubor Systemd Unit?

Četl jsem, že existují dvě složky pro soubory jednotek (ne v uživatelském režimu).

/usr/lib/systemd/system/: units provided by installed packages
/etc/systemd/system/: units installed by the system administrator

V rozporu s tímto chápáním je odpověď na tuto otázku:Jak napsat spouštěcí skript pro Systemd. Může někdo doplnit chybějící informace, abych pochopil, co se děje? (AKTUALIZACE:Odpověď byla aktualizována a mé chápání s ní již není v rozporu. )

Také se zdá, že skripty jsou organizovány v podsložkách v /etc/systemd/system/ složka:

getty.target.wants
multi-user.target.wants

V jiné lokalitě jsem se dočetl, že existují další lokality. Zdá se, že se jedná o služby specifické pro uživatele.

/usr/lib/systemd/user/ where services provided by installed packages go.
/etc/systemd/user/ where system-wide user services are placed by the system administrator.
~/.config/systemd/user/ where the user puts its own services.

Aktualizace 2015-08-31:

V zájmu ostatních zde je odkaz na související otázku, kterou jsem nedávno položil:Kam mám umístit skripty spouštěné jednotkami systemd?

Přijatá odpověď:

Nejlepší místo pro umístění systému soubory jednotek: /etc/systemd/system Nezapomeňte přidat cíl v části [Instalovat], přečtěte si „Jak to ví?“ pro detaily. AKTUALIZACE :/usr/local/lib/systemd/system je další možností, podrobnosti si přečtěte v části „Šedá oblast“.

Nejlepší místo pro umístění uživatele soubory jednotek: /etc/systemd/user nebo $HOME/.config/systemd/user ale záleží na oprávněních a situaci.

Pravdou je, že systémové jednotky (nebo jak je nazývá úvodní věta „konfigurace jednotek“) mohou jít kamkoli —za předpokladu, že jste ochotni vytvářet ruční symbolické odkazy a jste si vědomi upozornění. Usnadňuje život umístění jednotky na místo systemctl daemon-reload může to najít z několika dobrých důvodů:

  • Použití standardního umístění znamená, že je generátory systemd najdou a usnadní jejich aktivaci při spouštění pomocí systemctl enable . Je to proto, že vaše jednotka bude automaticky přidána do stromu závislosti jednotek (mezipaměť jednotek).
  • Nemusíte přemýšlet o oprávněních, protože do určených oblastí mohou zapisovat pouze správní privilegovaní uživatelé.

Jak to ví?

A jak přesně systemctl enable víte, kde vytvořit symbolický odkaz? Napevno jej zakódujete v
samotné jednotce pod [install] sekce. Obvykle je tam řádek jako

[Install]
WantedBy = multi-user.target

které odpovídá předdefinovanému místu v souborovém systému.
Tímto způsobem systemctl ví, že tato jednotka je závislá na skupině souborů jednotek s názvem multi-user.target („cíl“ je termín používaný k označení skupin závislostí jednotek. Všechny skupiny můžete vypsat pomocí systemctl list-units --type target ). Skupina souborů jednotek, které mají být načteny s cílem, je vložena do targetname.target.wants adresář. Toto je jen adresář plný symbolických odkazů (nebo to pravé). Pokud váš [Install] sekce říká, že je to WantedBy multi-user.target , ale pokud na něj neexistuje symbolický odkaz v multi-user.target.wants adresář, pak se nenačte. Když generátory jednotek systemd přidají váš soubor jednotky do mezipaměti stromu závislostí při spouštění (generátory můžete spustit ručně pomocí systemctl daemon-reload ), automaticky ví, kam umístit symbolický odkaz – v tomto případě do adresáře /etc/systemd/system/multi-user.target.wants/ měli byste to povolit.

Klíčové body v příručce:

Další jednotky mohou být načteny do systemd (“propojené”) z
adresářů, které nejsou na cestě načítání jednotek. Viz příkaz link pro
systemctl(1).

V části systemctl vyhledejte Příkazy souboru jednotek

Cesta načtení souboru jednotky

Přečtěte si prosím první větu v následujícím citátu z man systemd.unit a pochopte ji (protože to znamená, že všechny cesty, které zde zmiňuji, se na vás nemusí vztahovat, pokud byl váš systemd zkompilován s různými cestami):

Soubory jednotek se načítají ze sady cest určených během kompilace, které jsou popsány ve dvou tabulkách níže. Soubory jednotek nalezené v adresářích uvedených dříve přepíší soubory se stejným názvem v adresářích níže v seznamu.

Když je proměnná $SYSTEMD_UNIT_PATH je nastaven, obsah této proměnné přepíše cestu zatížení jednotky. Pokud $SYSTEMD_UNIT_PATH končí prázdnou komponentou („:“), k obsahu proměnné bude připojena obvyklá cesta načtení jednotky.

Tabulka 1 a Tabulka 2 z man systemd.unit jsou dobré.

Související:Echo to file deskriptor přepíše soubor?

Načíst cesty při spuštění v systémovém režimu (--system ).

  • /etc/systemd/system Místní konfigurace
  • /run/systemd/system Runtime jednotky
  • /usr/lib/systemd/system Jednotky nainstalovaných balíčků (nebo /lib/systemd/system v některých případech si přečtěte man systemd.unit )

Načíst cestu při spuštění v uživatelském režimu (--user )

Je rozdíl mezi na uživatele jednotky a vše/globálně uživatelských jednotek.

Závisí na uživateli

  • $XDG_CONFIG_HOME/systemd/user Konfigurace uživatele (používá se pouze při $XDG_CONFIG_HOME je nastaveno)

  • $HOME/.config/systemd/user Konfigurace uživatele (používá se pouze při $XDG_CONFIG_HOME není nastaveno)

  • $XDG_RUNTIME_DIR/systemd/user Běhové jednotky (používá se pouze při $XDG_RUNTIME_DIR je nastaveno)

  • $XDG_DATA_HOME/systemd/user Jednotky balíčků, které byly nainstalovány v domovském adresáři (používá se pouze v případě $XDG_DATA_HOME je nastaveno)

  • $HOME/.local/share/systemd/user Jednotky balíčků, které byly nainstalovány v domovském adresáři (používá se pouze v případě $XDG_DATA_HOME není nastaveno)

--global (všichni uživatelé)

Jednotky, které se vztahují na všechny uživatele – což znamená, že také vlastní každý uživatel. Každý uživatel tedy může tyto služby zastavit, i když je správce povolí při spouštění.

  • /etc/systemd/user Místní konfigurace pro všechny uživatele (systemctl --global enable userunit.service )
  • /usr/lib/systemd/user Jednotky balíčků, které byly nainstalovány v celém systému pro všechny uživatele (nebo /lib/systemd/system v některých případech si přečtěte man systemd.unit)
  • /run/systemd/user Runtime jednotky

Šedá oblast

Na jedné straně standard souborové hierarchie specifikuje /etc je pro místní konfigurace, které nespouštějí binární soubory. Na druhou stranu
určuje, že /usr/local/ „je určeno pro správce systému při místní instalaci softwaru“. Můžete také argumentovat (pokud to není jen pro účely organizace), že všechny soubory systémových jednotek by měly být umístěny pod /usr/local/lib/systemd/system , ale toto je určeno pro soubory jednotek, které jsou součástí „softwaru“, nikoli od správce balíčků.
Odpovídající uživatelské jednotky systemd, které jsou celosystémové, mohou být umístěny pod /usr/local/lib/systemd/user .

Přechodná jednotka

Další zapomenuté místo není vůbec nikde! Možná méně známým programem je systemd-run . Můžete jej použít ke spuštění přechodných jednotek za chodu. viz man systemd-run .

Chcete-li například naplánovat restart na zítra ráno ve 4 hodiny ráno (možná budete potřebovat --force abyste zajistili, že dojde k restartu):

systemd-run -u restart --description="Restarts machine" --on-calendar="2020-12-18 00:04:00" systemctl --force reboot

Tím vznikne přechodný soubor jednotky restart.service a odpovídající časovač (kvůli --on-calendar , označeno transient=yes .

/run/systemd/transient/restart.service

# This is a transient unit file, created programmatically via the systemd API. Do not edit.
[Unit]
Description=Restarts machine

[Service]
ExecStart=
ExecStart="/usr/bin/systemctl" "--force" "reboot"

Všimněte si, že existuje také nebezpečnější možnost dvojité síly --force --force , který říká jádru, aby se okamžitě zastavilo (a pokud nevíte, co děláte, není to bezpečné, protože je to téměř ekvivalentní vypnutí napájení).

Související:Nízkoenergetické zařízení v uzavřené jednotce — pomoc s návrhem?
Linux
  1. Chyba kompilace Openssl

  2. Příkaz sed pro Linux nemění cílový soubor

  3. Linux:Kam umístit odkládací soubor

  1. Zkopírujte soubory v terminálu Linux

  2. Přejmenujte soubor v terminálu Linux

  3. Přesunout soubory v terminálu Linux

  1. Spravujte spouštění pomocí systemd

  2. Použití příkazu systemctl ke správě jednotek systemd

  3. Jak zkopírovat soubor a vytvořit cílové adresáře současně?