Esecuzione dello script Redshift come servizio
Sono molto nuovo su Linux e sto cercando di fare pratica scrivendo script e creando i miei servizi. Volevo prendere il mio semplice script redshift che cambia la temperatura del colore del mio schermo e renderlo un servizio. Lo script funziona quando lo eseguo nel terminale, ma quando provo a eseguirlo in un file .service mi imbatto in un problema. Qualsiasi aiuto sarebbe apprezzato.
Il mio script (redshift.sh):
#!/bin/bash
redshift -O 1500
eseguendo ./redshift.shVedo il mio cambiamento schermo a colori temp e ottengo in uscita: Using method randr.
Il mio servizio (redshift.service):
[Unit]
Description=Set Redshift
[Service]
Type=simple
ExecStart=/bin/bash /usr/bin/redshift.sh
[Install]
WantedBy=default.target
L'aspettativa è che redshift.service esegua il mio script redshift.sh .
Impostazione del servizio:
Ho copiato il file di script /usr/bine ho cambiato la modalità in x (eseguibile).
sudo cp redshift.sh /usr/bin/redshift.sh
sudo chmod +x /usr/bin/redshift.sh
Ho copiato il file di servizio in /etc/systemd/systeme ho cambiato la modalità in 644.
sudo cp redshift.service /etc/systemd/system/redshift.service
sudo chmod 644 /etc/systemd/system/redshift.service
Sto provando a eseguire il mio servizio:
sudo systemctl start redshift
La temperatura del colore del display non cambia!
Ottenere lo stato del servizio:
sudo systemctl status redshift
A giudicare dall'output di systemctl status, vedo che lo script ha tentato di eseguire, ma si sono verificati alcuni errori. Qualche idea sul perché questo potrebbe essere il caso? L'output di stato è mostrato di seguito.
"Loaded: loaded (/etc/systemd/system/redshift.service; disabled; vendor preset: enabled)
Active: failed (Result: exit-code) since Fri 2020-09-04 11:40:11 EDT; 8s ago
Process: 21928 ExecStart=/bin/bash /usr/bin/redshift.sh (code=exited, status=1/FAILURE)
Main PID: 21928 (code=exited, status=1/FAILURE)
Sep 04 11:40:11 labpc-ThinkPad-T540p bash[21933]: `RANDR Query Version' returned error -1
Sep 04 11:40:11 labpc-ThinkPad-T540p bash[21933]: Initialization of randr failed.
Sep 04 11:40:11 labpc-ThinkPad-T540p bash[21933]: Trying next method...
Sep 04 11:40:11 labpc-ThinkPad-T540p bash[21933]: No protocol specified
Sep 04 11:40:11 labpc-ThinkPad-T540p bash[21933]: X request failed: XOpenDisplay
Sep 04 11:40:11 labpc-ThinkPad-T540p bash[21933]: Initialization of vidmode failed.
Sep 04 11:40:11 labpc-ThinkPad-T540p bash[21933]: Trying next method...
Sep 04 11:40:11 labpc-ThinkPad-T540p bash[21933]: No more methods to try.
Sep 04 11:40:11 labpc-ThinkPad-T540p systemd[1]: redshift.service: Main process exited, code=exited, status=1/FA>
Sep 04 11:40:11 labpc-ThinkPad-T540p systemd[1]: redshift.service: Failed with result 'exit-code'."
Stavo seguendo questo tutorial per rendere il mio servizio: https://www.linode.com/docs/quick-answers/linux/start-service-at-boot/#create-a-custom-systemd-service
Risposte
Potrebbe essere necessario impostare variabili env come display & Xauth.
Il mio servizio ha questa riga aggiunta alla [service]sezione
Environment="DISPLAY=:0" "XAUTHORITY=/run/user/1000/gdm/Xauthority"
Vedi questo thread per ulteriori dettagli.
Anche l'execstart non deve essere un .sh. Puoi impostare il percorso come redshift exec (o nel tuo caso digita il comando come faresti in un terminale poiché immagino che il redshift sia nel tuo PATH)
È necessario definire display come ambiente ed eseguire dopo l'avvio di display manager.
Si prega di vedere il contenuto di seguito.
[Unit]
Description=Redshift
After=display-manager.service
[Service]
Environment=DISPLAY=:0
ExecStart=/usr/bin/redshift -O 1500
Restart=always
[Install]
WantedBy=default.target
È inoltre possibile definire parametri ExeStarted eliminare script bash personalizzati aggiuntivi.