Exécution du script Redshift en tant que service
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
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)
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.