
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.sh
veo 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/bin
y 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/system
y 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'."
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 ExeStart
y eliminar scripts bash personalizados adicionales.