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.サービススクリプトを実行するレッドシフト

サービスの設定:

スクリプト ファイルをコピーし/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 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

display や​​ 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 スクリプトを排除することもできます。

関連情報