Ejecutando el script Redshift como servicio

Ejecutando el script Redshift como servicio

Soy muy nuevo en Linux y estoy tratando de practicar escribiendo scripts y creando mis propios servicios. Quería tomar mi sencillo script de desplazamiento 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 tengo un problema. Cualquier ayuda sería apreciada.

Mi secuencia de comandos (desplazamiento al rojo.sh):

#!/bin/bash
redshift -O 1500

Al ejecutar, ./redshift.shveo que mi pantalla cambia la temperatura de color y obtengo el resultado: Using method randr.

Mi servicio (desplazamiento al rojo.servicio):

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

La expectativa es tenerservicio.desplazamiento al rojoejecutar mi scriptcorrimiento al rojo.sh.

Configuración del servicio:

Copié el archivo de script /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 del color de la pantalla no cambia!

Obtener el estado del servicio:

sudo systemctl status redshift

A juzgar por el resultado del estado systemctl, veo que el script intentó ejecutarse, pero se produjeron algunas fallas. ¿Alguna idea sobre por qué este podría ser 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'."

salida de estado

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

Respuesta1

Es posible que tengas que configurar variables de entorno como display y Xauth.

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

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

Mira estohilopara más detalles.

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

Respuesta2

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 scripts bash personalizados adicionales.

información relacionada