Exécution du script Redshift en tant que service

Sep 05 2020

Je suis très nouveau sur Linux et j'essaie de m'entraîner à écrire des scripts et à créer mes propres services. Je voulais prendre mon simple script redshift simple qui change la température de couleur de mon écran et en faire un service. Le script fonctionne lorsque je l'exécute dans le terminal, mais lorsque j'essaie de l'exécuter dans un fichier .service, je rencontre un problème. Toute aide serait appréciée.

Mon script (redshift.sh):

#!/bin/bash
redshift -O 1500

en exécutant ./redshift.shje vois mon changement d'écran température de couleur et obtenir une sortie: Using method randr.

Mon service (redshift.service):

[Unit]
Description=Set Redshift
[Service]
Type=simple
ExecStart=/bin/bash /usr/bin/redshift.sh
[Install]
WantedBy=default.target

On s'attend à ce que redshift.service exécute mon script redshift.sh .

Configuration du service:

J'ai copié le fichier de script /usr/binet changé de mode en x (exécutable).

sudo cp redshift.sh /usr/bin/redshift.sh 
sudo chmod +x /usr/bin/redshift.sh

J'ai copié le fichier de service /etc/systemd/systemet changé de mode en 644.

sudo cp redshift.service /etc/systemd/system/redshift.service 
sudo chmod 644 /etc/systemd/system/redshift.service 

Essayer d'exécuter mon service:

sudo systemctl start redshift

La température de couleur d'affichage ne change pas!

Obtenir l'état du service:

sudo systemctl status redshift

A en juger par la sortie du statut systemctl, je vois que le script a essayé de s'exécuter, mais des échecs se sont produits. Des réflexions sur pourquoi cela pourrait être le cas? La sortie d'état est indiquée ci-dessous.

"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'."

Je suivais ce tutoriel pour rendre mon service: https://www.linode.com/docs/quick-answers/linux/start-service-at-boot/#create-a-custom-systemd-service

Réponses

1 yobart Oct 27 2020 at 19:54

Vous devrez peut-être définir des variables d'environnement telles que display & Xauth.

Mon service a cette ligne ajoutée à la [service]section

Environment="DISPLAY=:0" "XAUTHORITY=/run/user/1000/gdm/Xauthority"

Voir ce fil pour plus de détails.

De plus, execstart n'a pas besoin d'être un .sh. Vous pouvez définir le chemin pour être le redshift exec (ou dans votre cas, tapez la commande comme vous le feriez dans un terminal car je suppose que redshift est dans votre PATH)

KKPatel Nov 02 2020 at 02:22

Vous devez définir l'affichage comme environnement et l'exécuter après le démarrage du gestionnaire d'affichage.

Veuillez consulter le contenu ci-dessous.

[Unit]
Description=Redshift
After=display-manager.service

[Service]
Environment=DISPLAY=:0
ExecStart=/usr/bin/redshift -O 1500
Restart=always

[Install]
WantedBy=default.target

Vous pouvez également définir des paramètres dans ExeStartet éliminer un script bash personnalisé supplémentaire.