So schreiben Sie ein Startskript für systemd

233

Ich habe 2 Grafikkarten auf meinem Laptop. Einer ist IGP und ein anderer diskret.

Ich habe ein Shell-Skript geschrieben, um die diskrete Grafikkarte auszuschalten.

Wie kann ich es in ein systemd-Skript konvertieren, um es beim Start auszuführen?

Sharique
quelle

Antworten:

332

Hierfür gibt es hauptsächlich zwei Ansätze:

  • Wenn Sie ein Skript ausführen müssen, konvertieren Sie es nicht, sondern führen das Skript über einen systemdDienst aus.

Dazu benötigen Sie zwei Dateien: das Skript und die .serviceDatei (Gerätekonfigurationsdatei).
Stellen Sie sicher, dass Ihr Skript ausführbar ist und die erste Zeile (der Shebang ) ist #!/bin/sh. Dann erstellen Sie die .serviceDatei in /etc/systemd/system(eine reine Textdatei, nennen wir es vgaoff.service).
Zum Beispiel:

  1. das Drehbuch: /usr/bin/vgaoff
  2. die Unit-Datei: /etc/systemd/system/vgaoff.service

Bearbeiten Sie nun die Unit-Datei. Der Inhalt hängt davon ab, wie Ihr Skript funktioniert:

Wenn Sie vgaoffnur die GPU ausschalten, zB:

exec blah-blah pwrOFF etc 

dann sollte der Inhalt von vgaoff.servicesein:

[Unit]
Description=Power-off gpu

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

[Install]
WantedBy=multi-user.target

Wird vgaoffverwendet, um die GPU auszuschalten und auch wieder einzuschalten, z. B .:

start() {
  exec blah-blah pwrOFF etc
}

stop() {
  exec blah-blah pwrON etc
}

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

dann sollte der Inhalt von vgaoff.servicesein:

[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
  • In den einfachsten Fällen können Sie auf das Skript verzichten und einen bestimmten Befehl direkt ausführen:

Ausschalten:

[Unit]
Description=Power-off gpu

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

[Install]
WantedBy=multi-user.target

So schalten Sie das Gerät aus und wieder ein:

[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

Sobald Sie mit den Dateien fertig sind, aktivieren Sie den Dienst:

systemctl enable vgaoff.service

Beim nächsten Start wird es automatisch gestartet. Sie können den Dienst sogar auf einmal aktivieren und starten

systemctl enable --now vgaoff.service

ab systemd v.220(bei älteren Setups müssen Sie es manuell starten).
Weitere Details finden Sie auf der systemd.serviceManpage.


Fehlerbehebung .
Beginnen Sie hier:
Wie wird das vollständige Protokoll eines systemdDienstes angezeigt?
systemdService-Exit-Codes und Erklärung der Statusinformationen

don_crissti
quelle
Danke für die ausführliche Antwort. Das Skript enthält einen Befehl "echo OFF> / sys / kernel / debug / vgaswitcheroo / switch"
Sharique
es schlägt mit folgender Meldung fehl vgaoff.service - Power-off gpu Loaded: loaded (/usr/lib/systemd/system/vgaoff.service; enabled) Aktiv: fehlgeschlagen (Ergebnis: Exit-Code) seit Di, 11.09.2012 23: 46:46 +0530; Vor 30s Prozess: 5258 ExecStart = / usr / lib / systemd / scripts / vgaoff (Code = beendet, Status = 203 / EXEC) CGroup: Name = systemd: /system/vgaoff.service
Sharique
Hoppla, nicht schon wieder, ich habe dieses kleine Ding verpasst, es funktioniert einwandfrei. Nochmals vielen Dank.
Sharique
5
@Bazon - Nach dieser Logik sind Tausende von Antworten auf dieser Website "potenzielle Fallen" für unerfahrene Benutzer. Personen, die nicht genau wissen, was echo SOMETHING > /some/filesie tun (oder überhaupt keinen anderen Befehl), sollten sich mit den Grundlagen von CLI vertraut machen, bevor Sie versuchen, Inhalte auf ihren Systemen auszuführen. Abgesehen davon lesen Sie, wie Sie dGPU auf mehreren Laptop-Modellen ausschalten, ob die dort verwendeten Befehle durch etwas ersetzt werden könnten, wie Sie es vorschlagen. Um die ursprüngliche Datei wiederherzustellen, installieren Sie in der Regel das zugehörige Paket neu.
don_crissti
4
@don_crissti whoops! Danke für den Tipp. (Mein ursprünglicher Kommentar wurde gelöscht, um die Weitergabe irreführender Informationen zu vermeiden.)
Woodrow Barlow