Jak napisać skrypt startowy dla systemd

233

Mam 2 karty graficzne na swoim laptopie. Jeden to IGP, a drugi dyskretny.

Napisałem skrypt powłoki, aby wyłączyć dyskretną kartę graficzną.

Jak przekonwertować go na skrypt systemowy, aby uruchomić go podczas uruchamiania?

Sharique
źródło

Odpowiedzi:

332

Istnieją głównie dwa podejścia do tego:

  • Jeśli musisz uruchomić skrypt, nie konwertujesz go, ale raczej uruchamiasz skrypt za pośrednictwem systemdusługi.

Dlatego potrzebujesz dwóch plików: skryptu i .servicepliku (plik konfiguracji jednostki).
Upewnij się, że skrypt jest wykonywalny, a pierwsza linia ( shebang ) to #!/bin/sh. Następnie utwórz .serviceplik w /etc/systemd/system(nazwijmy go zwykłym plikiem tekstowym vgaoff.service).
Na przykład:

  1. scenariusz: /usr/bin/vgaoff
  2. plik jednostkowy: /etc/systemd/system/vgaoff.service

Teraz edytuj plik jednostki. Jego zawartość zależy od sposobu działania skryptu:

Jeśli vgaoffpo prostu wyłącza GPU, np .:

exec blah-blah pwrOFF etc 

wówczas treść vgaoff.servicepowinna być:

[Unit]
Description=Power-off gpu

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

[Install]
WantedBy=multi-user.target

Jeśli vgaoffjest używany do wyłączenia GPU, a także do ponownego włączenia, np .:

start() {
  exec blah-blah pwrOFF etc
}

stop() {
  exec blah-blah pwrON etc
}

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

wówczas treść vgaoff.servicepowinna 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
  • W najbardziej trywialnych przypadkach możesz obejść się bez skryptu i bezpośrednio wykonać określone polecenie:

Aby wyłączyć:

[Unit]
Description=Power-off gpu

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

[Install]
WantedBy=multi-user.target

Aby wyłączyć i włączyć:

[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

Gdy skończysz z plikami, włącz usługę:

systemctl enable vgaoff.service

Rozpocznie się automatycznie przy następnym uruchomieniu. Możesz nawet włączyć i uruchomić usługę za jednym razem

systemctl enable --now vgaoff.service

od systemd v.220(w starszych konfiguracjach będziesz musiał uruchomić go ręcznie).
Aby uzyskać więcej informacji, patrz systemd.servicestrona instrukcji.


Rozwiązywanie problemów .
Zacznij tutaj:
jak wyświetlić pełny dziennik systemdusługi?
systemdkody wyjścia usług i objaśnienie informacji o stanie

don_crissti
źródło
Dziękuję za szczegółową odpowiedź. Skrypt zawiera jedno polecenie „echo WYŁ.> / Sys / kernel / debug / vgaswitcheroo / switch”
Sharique
kończy się niepowodzeniem z następującym komunikatem vgaoff.service - Wyłączenie gpu Załadowano: załadowano (/usr/lib/systemd/system/vgaoff.service; włączone) Aktywne: nie powiodło się (Wynik: kod wyjścia) od wtorku, 11 września 2012 23: 46:46 +0530; 30s temu Proces: 5258 ExecStart = / usr / lib / systemd / scripts / vgaoff (code = exited, status = 203 / EXEC) CGroup: name = systemd: /system/vgaoff.service
Sharique
Ups, nie znowu, tęskniłem za tą małą rzeczą, działa dobrze .. dzięki jeszcze raz.
Sharique,
5
@Bazon - zgodnie z tą logiką tysiące odpowiedzi na tej stronie to „potencjalne pułapki” dla niedoświadczonych użytkowników. Ludzie, którzy nie wiedzą / nie rozumieją w pełni, co echo SOMETHING > /some/filewłaściwie robi (lub jakakolwiek inna komenda), powinni zapoznać się z podstawami CLI przed próbą uruchomienia rzeczy w swoich systemach. Poza tym, FYI, przeczytaj, jak wyłączyć dGPU na kilku modelach laptopów, zobacz, czy użyte tam polecenia można zastąpić czymś, co sugerujesz. Ponadto, aby przywrócić oryginalny plik, zwykle ponownie instalujesz pakiet, który jest jego właścicielem.
don_crissti
4
@don_crissti whoops! dzięki za wskazówkę. (usunąłem mój oryginalny komentarz, aby uniknąć rozpowszechniania wprowadzających w błąd informacji).
Woodrow Barlow