Come scrivere script di avvio per systemd


233

Ho 2 schede grafiche sul mio laptop. Uno è IGP e un altro discreto.

Ho scritto uno script di shell per disattivare la scheda grafica discreta.

Come posso convertirlo in systemd script per eseguirlo all'avvio?

Risposte:


332

Ci sono principalmente due approcci per farlo:

  • Se devi eseguire uno script, non lo converti ma piuttosto esegui lo script tramite un systemdservizio.

Pertanto sono necessari due file: lo script e il .servicefile (file di configurazione dell'unità).
Assicurati che il tuo script sia eseguibile e la prima riga (lo shebang ) lo sia #!/bin/sh. Quindi crea il .servicefile in /etc/systemd/system(un file di testo semplice, chiamiamolo vgaoff.service).
Per esempio:

  1. il copione: /usr/bin/vgaoff
  2. il file dell'unità: /etc/systemd/system/vgaoff.service

Ora modifica il file dell'unità. Il suo contenuto dipende da come funziona il tuo script:

Se vgaoffsi spegne semplicemente la GPU, ad esempio:

exec blah-blah pwrOFF etc 

quindi il contenuto di vgaoff.servicedovrebbe essere:

[Unit]
Description=Power-off gpu

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

[Install]
WantedBy=multi-user.target

Se vgaoffviene utilizzato per spegnere la GPU e anche per riaccenderla, ad esempio:

start() {
  exec blah-blah pwrOFF etc
}

stop() {
  exec blah-blah pwrON etc
}

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

quindi il contenuto di vgaoff.servicedovrebbe essere:

[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
  • Per i casi più banali, puoi fare a meno dello script ed eseguire direttamente un determinato comando:

Per spegnere:

[Unit]
Description=Power-off gpu

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

[Install]
WantedBy=multi-user.target

Per spegnere e riaccendere:

[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

Una volta terminati i file, abilita il servizio:

systemctl enable vgaoff.service

Si avvierà automaticamente al prossimo avvio. È anche possibile abilitare e avviare il servizio in una volta sola

systemctl enable --now vgaoff.service

a partire da systemd v.220(su configurazioni precedenti dovrai avviarlo manualmente).
Per maggiori dettagli consultare systemd.servicela pagina del manuale.


Risoluzione dei problemi .
Inizia qui:
come visualizzare il registro completo di un systemdservizio?
systemdcodici di uscita del servizio e spiegazione delle informazioni sullo stato


Grazie per la risposta dettagliata. Lo script contiene un comando "echo OFF> / sys / kernel / debug / vgaswitcheroo / switch"
Sharique,

fallisce con il seguente messaggio vgaoff.service - Spegnimento gpu Caricato: caricato (/usr/lib/systemd/system/vgaoff.service; abilitato) Attivo: fallito (Risultato: codice di uscita) da Mar, 11 Set 2012 23: 46:46 +0530; 30 anni fa Processo: 5258 ExecStart = / usr / lib / systemd / scripts / vgaoff (codice = uscito, stato = 203 / EXEC) CGroup: nome = systemd: /system/vgaoff.service
Sharique

oops, non ancora, mi è sfuggita questa piccola cosa, funziona benissimo .. grazie ancora.
Sharique,

5
@Bazon - secondo questa logica, migliaia di risposte su questo sito sono "potenziali trappole" per utenti inesperti. Le persone che non sanno / comprendono appieno ciò che echo SOMETHING > /some/filefa (o qualsiasi altro comando di fatto) dovrebbero acquisire familiarità con le basi della CLI prima di tentare di eseguire roba sui propri sistemi. A parte questo, FYI, leggere come passare dGPU off su diversi modelli di laptop, vedere se i comandi usati ci potrebbe essere sostituito con qualcosa come lei suggerisce. Inoltre, per ripristinare il file originale di solito reinstalli il pacchetto che lo possiede.
don_crissti,

4
@don_crissti whoops! grazie per il consiglio. (cancellato il mio commento originale per evitare la propagazione di informazioni fuorvianti.)
Woodrow Barlow
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.