Executando o script Redshift como um serviço

Executando o script Redshift como um serviço

Sou muito novo no Linux e estou tentando praticar escrevendo scripts e criando meus próprios serviços. Eu queria pegar meu script redshift simples que altera a temperatura da cor da minha tela e torná-lo um serviço. O script funciona quando eu o executo no terminal, mas quando tento executá-lo em um arquivo .service, tenho problemas. Qualquer ajuda seria apreciada.

Meu script (redshift.sh):

#!/bin/bash
redshift -O 1500

executando, ./redshift.shvejo minha tela mudar de temperatura de cor e obter a saída: Using method randr.

Meu serviço (redshift.service):

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

A expectativa é terredshift.serviçoexecutar meu scriptredshift.sh.

Configurando o serviço:

Copiei o arquivo de script /usr/bine mudei o modo para x (executável).

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

Copiei o arquivo de serviço /etc/systemd/systeme mudei o modo para 644.

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

Tentando executar meu serviço:

sudo systemctl start redshift

A temperatura da cor da tela não muda!

Obtendo status do serviço:

sudo systemctl status redshift

A julgar pela saída do status systemctl, vejo que o script tentou ser executado, mas ocorreram algumas falhas. Alguma idéia de por que isso pode ser o caso? A saída de status é mostrada abaixo.

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

saída de status

Eu estava seguindo este tutorial para fazer meu serviço:https://www.linode.com/docs/quick-answers/linux/start-service-at-boot/#create-a-custom-systemd-service

Responder1

Talvez seja necessário definir variáveis ​​​​de ambiente, como display e Xauth.

Meu serviço tem esta linha adicionada à [service]seção

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

Veja issofiopara mais detalhes.

Além disso, o execstart não precisa ser um .sh. Você pode definir o caminho para ser o redshift exec (ou, no seu caso, digite o comando como faria em um terminal, pois acho que o redshift está no seu PATH)

Responder2

Você precisa definir a exibição como ambiente e executar após iniciar o gerenciador de exibição.

Por favor, veja o conteúdo abaixo.

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

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

[Install]
WantedBy=default.target

Você também pode definir parâmetros ExeStarte eliminar scripts bash personalizados extras.

informação relacionada