Redshift 스크립트를 서비스로 실행

Sep 05 2020

저는 Linux를 처음 접했고 스크립트 작성과 서비스 제작을 연습하려고합니다. 화면의 색온도를 변경하는 간단한 redshift 스크립트를 사용하여 서비스로 만들고 싶었습니다. 스크립트는 터미널에서 실행할 때 작동하지만 .service 파일에서 실행하려고하면 문제가 발생합니다. 어떤 도움을 주시면 감사하겠습니다.

내 스크립트 (redshift.sh) :

#!/bin/bash
redshift -O 1500

실행하면 ./redshift.sh화면 색상 온도가 변경되고 출력이 표시 Using method randr됩니다.

내 서비스 (redshift.service) :

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

redshift.service 가 내 스크립트 redshift.sh를 실행하도록하는 것이 예상됩니다 .

서비스 설정 :

스크립트 파일을에 복사하고 /usr/bin모드를 x (실행 가능)로 변경했습니다.

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

서비스 파일을에 복사하고 /etc/systemd/system모드를 644로 변경했습니다.

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

내 서비스를 실행하는 중 :

sudo systemctl start redshift

디스플레이 색 온도가 변하지 않습니다!

서비스 상태 가져 오기 :

sudo systemctl status redshift

systemctl 상태의 출력으로 판단하면 스크립트가 실행을 시도했지만 일부 실패가 발생했음을 알 수 있습니다. 왜 이것이 사실 일지에 대한 생각이 있습니까? 상태 출력은 아래와 같습니다.

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

내 서비스를 만들기 위해이 튜토리얼을 따랐습니다. https://www.linode.com/docs/quick-answers/linux/start-service-at-boot/#create-a-custom-systemd-service

답변

1 yobart Oct 27 2020 at 19:54

디스플레이 및 Xauth와 같은 환경 변수를 설정해야 할 수도 있습니다.

내 서비스에이 줄이 [service]섹션에 추가되었습니다.

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

자세한 내용은이 스레드 를 참조하십시오 .

또한 execstart는 .sh가 아니어도됩니다. 경로를 redshift exec로 설정할 수 있습니다 (또는 redshift가 PATH에 있다고 생각하므로 터미널에서와 같이 명령을 입력하십시오)

KKPatel Nov 02 2020 at 02:22

디스플레이를 환경으로 정의하고 디스플레이 관리자가 시작된 후 실행해야합니다.

아래 내용을 참조하십시오.

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

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

[Install]
WantedBy=default.target

매개 변수를 정의 ExeStart하고 추가 사용자 정의 bash 스크립트를 제거 할 수도 있습니다 .