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

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

저는 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/binx(실행 가능)로 복사하고 모드를 변경했습니다.

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

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

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 status의 출력으로 판단하면 스크립트가 실행을 시도했지만 일부 실패가 발생한 것으로 보입니다. 왜 이런 일이 일어날 수 있는지에 대한 생각이 있습니까? 상태 출력은 아래와 같습니다.

"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

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

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

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

이것 좀 봐자세한 내용은

또한 execstart가 .sh일 필요는 없습니다. 경로를 redshift exec로 설정할 수 있습니다(또는 귀하의 경우 redshift가 PATH에 있는 것으로 추측되므로 터미널에서 명령을 입력하십시오).

답변2

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

아래 내용을 참조하시기 바랍니다.

[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 스크립트 에서 매개변수를 정의하고 제거할 수도 있습니다 .

관련 정보