Ejecución del script Redshift como servicio

Sep 05 2020

Soy muy nuevo en Linux y estoy tratando de practicar la escritura de scripts y la creación de mis propios servicios. Quería tomar mi sencillo script de corrimiento al rojo que cambia la temperatura de color de mi pantalla y convertirlo en un servicio. El script funciona cuando lo ejecuto en la terminal, pero cuando intento ejecutarlo en un archivo .service me encuentro con un problema. Cualquier ayuda sería apreciada.

Mi secuencia de comandos (redshift.sh):

#!/bin/bash
redshift -O 1500

mediante la ejecución ./redshift.shveo mi color cambio de imagen temporal y obtener una salida: Using method randr.

Mi servicio (redshift.service):

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

La expectativa es que redshift.service ejecute mi script redshift.sh .

Configuración del servicio:

Copié el archivo de secuencia de comandos /usr/biny cambié el modo a x (ejecutable).

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

Copié el archivo de servicio /etc/systemd/systemy cambié el modo a 644.

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

Intentando ejecutar mi servicio:

sudo systemctl start redshift

¡La temperatura de color de la pantalla no cambia!

Obtener el estado del servicio:

sudo systemctl status redshift

A juzgar por la salida del estado systemctl, veo que el script intentó ejecutarse, pero se produjeron algunas fallas. ¿Alguna idea sobre por qué podría ser este el caso? La salida de estado se muestra a continuación.

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

Estaba siguiendo este tutorial para hacer mi servicio: https://www.linode.com/docs/quick-answers/linux/start-service-at-boot/#create-a-custom-systemd-service

Respuestas

1 yobart Oct 27 2020 at 19:54

Es posible que deba configurar variables de entorno como display & Xauth.

Mi servicio tiene esta línea agregada a la [service]sección

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

Vea este hilo para más detalles.

Además, el execstart no tiene que ser un .sh. Puede configurar la ruta para que sea el ejecutivo de desplazamiento al rojo (o en su caso, escriba el comando como lo haría en una terminal, ya que supongo que el desplazamiento al rojo está en su RUTA)

KKPatel Nov 02 2020 at 02:22

Debe definir la pantalla como entorno y ejecutarla después de que se inicie el administrador de pantalla.

Consulte el contenido a continuación.

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

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

[Install]
WantedBy=default.target

También puede definir parámetros ExeStarty eliminar un script bash personalizado adicional.