it-swarm-eu.dev

Jak napsat spouštěcí skript pro systemd

Mám na svém notebooku 2 grafické karty. Jeden je IGP a další diskrétní.

Napsal jsem skript Shell, abych vypnul diskrétní grafickou kartu.

Jak je lze převést do skriptu systemd a spustit při spuštění?

236
Sharique

K tomu jsou hlavně dva přístupy:

  • Pokud musíte spustit skript, nepřevádějte jej, ale spusťte skript prostřednictvím služby systemd.

Proto potřebujete dva soubory: skript a .service file (konfigurační soubor jednotky).
Zkontrolujte, zda je váš skript spustitelný a první řádek ( Shebang ) je #!/bin/sh. Poté vytvořte .service soubor v /etc/systemd/system (obyčejný textový soubor, nazveme jej vgaoff.service).
Například:

  1. scénář: /usr/bin/vgaoff
  2. soubor jednotky: /etc/systemd/system/vgaoff.service

Nyní upravte soubor jednotky. Jeho obsah závisí na tom, jak váš skript funguje:

Pokud vgaoff pouze vypne gpu, např .:

exec blah-blah pwrOFF etc 

pak obsah vgaoff.service mělo by:

[Unit]
Description=Power-off gpu

[Service]
Type=oneshot
ExecStart=/usr/bin/vgaoff

[Install]
WantedBy=multi-user.target

Pokud se používá vgaoff k vypnutí GPU a také k jeho opětovnému zapnutí, např .:

start() {
  exec blah-blah pwrOFF etc
}

stop() {
  exec blah-blah pwrON etc
}

case $1 in
  start|stop) "$1" ;;
esac

pak obsah vgaoff.service mělo by:

[Unit]
Description=Power-off gpu

[Service]
Type=oneshot
ExecStart=/usr/bin/vgaoff start
ExecStop=/usr/bin/vgaoff stop
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
  • Pro nejzávažnější případy můžete obejít bez skriptu a přímo provést určitý příkaz:

Vypnutí:

[Unit]
Description=Power-off gpu

[Service]
Type=oneshot
ExecStart=/bin/sh -c "echo OFF > /whatever/vga_pwr_gadget/switch"

[Install]
WantedBy=multi-user.target

Vypnutí a zapnutí:

[Unit]
Description=Power-off gpu

[Service]
Type=oneshot
ExecStart=/bin/sh -c "echo OFF > /whatever/vga_pwr_gadget/switch"
ExecStop=/bin/sh -c "echo ON > /whatever/vga_pwr_gadget/switch"
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

Jakmile soubory dokončíte, povolte službu:

systemctl enable vgaoff.service

Spustí se automaticky při příštím spuštění. Můžete dokonce povolit a spustit službu najednou

systemctl enable --now vgaoff.service

do systemd v.220 (u starších nastavení ji musíte spustit ručně).
Další podrobnosti viz systemd.service manuální stránka.


Odstraňování problémů .
Začněte zde:
Jak zobrazit úplný protokol služby systemd?
systemd výstupní kódy služeb a vysvětlení stavových informací

340
don_crissti