GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie schreibe ich ein Startskript für Systemd?

Ich habe 2 Grafikkarten in meinem Laptop. Eines ist IGP und ein anderes 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?

Akzeptierte Antwort:

Dafü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 ein systemd aus Dienst.

Dazu benötigen Sie zwei Dateien:das Skript und den .service Datei (Unit-Konfigurationsdatei).
Stellen Sie sicher, dass Ihr Skript ausführbar ist und die erste Zeile (die shebang ) ist #!/bin/sh . Erstellen Sie dann den .service Datei in /etc/systemd/system (eine reine Textdatei, nennen wir sie vgaoff.service ).
Zum Beispiel:

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

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

Wenn vgaoff schaltet nur die GPU aus, z. B.:

exec blah-blah pwrOFF etc 

dann den Inhalt von vgaoff.service sollte sein:

[Unit]
Description=Power-off gpu

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

[Install]
WantedBy=multi-user.target

Wenn vgaoff wird verwendet, 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 den Inhalt von vgaoff.service sollte sein:

[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
  • Für die trivialsten Fälle kann man auf das Skript verzichten und direkt einen bestimmten Befehl 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

Zum Aus- und Einschalten:

[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

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

systemctl enable vgaoff.service

Es startet automatisch beim nächsten Booten. Mit

können Sie den Dienst sogar in einem Rutsch 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 unter systemd.service Handbuchseite.

Fehlerbehebung .
Beginnen Sie hier:
So sehen Sie das vollständige Protokoll eines systemd service?
systemd Service-Exit-Codes und Erklärung der Statusinformationen


Linux
  1. So erstellen Sie einen Systemd-Dienst unter Linux

  2. Linux – Speicherort des Fsck-Skripts?

  3. Wie ändere ich den Benutzer für eine Reihe von Systemd-Dienstdateien?

  4. Wie konfiguriert man Systemd, um ein einfaches Skript mit Standardio in einen Netzwerkdienst umzuwandeln?

  5. So führen Sie ein Shell-Skript beim Start aus

So schreiben Sie ein Bash-Skript mit Beispielen

So führen Sie Shell-Skript als Systemd-Dienst in Linux aus

So schreiben Sie ein Shell-Skript in Ubuntu

So richten Sie die automatische Ausführung eines Python-Skripts mit Systemd ein

So führen Sie Shell-Skript als SystemD-Dienst in Linux aus

So legen Sie ulimit-Werte für einen systemd-Dienst fest