Запуск скрипта 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.сервисвыполнить мой сценарий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 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.

Связанный контент