Запуск скрипта Redshift в качестве службы

Я совсем новичок в Linux и пытаюсь получить практику в написании скриптов и создании собственных служб. Я хотел взять мой простой скрипт redshift, который изменяет цветовую температуру моего экрана, и сделать его сервисом. Сценарий работает, когда я выполняю его в терминале, но когда я пытаюсь выполнить его в файле .service, я сталкиваюсь с проблемой. Любая помощь будет оценена по достоинству.

Мой скрипт (redshift.sh):

#!/bin/bash
redshift -O 1500

выполнив ./redshift.sh я вижу, как мой экран меняет цветовую температуру и получает вывод: Используя метод 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 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'."

status output

Я следовал этому руководству, чтобы создать свою службу: https://www.linode.com/docs/quick-answers/linux/start-service-at-boot/#create-a-custom-systemd-service

1
задан 5 September 2020 в 09:22

2 ответа

Возможно, вам придется установить переменные env, такие как display и Xauth.

Эта строка моего сервиса добавлена ​​в раздел [service]

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

Дополнительные сведения см. в этой теме.

Также execstart не обязательно должен быть .sh. Вы можете установить путь для исполняемого файла redshift (или, в вашем случае, введите команду, как в терминале, поскольку я предполагаю, что redshift находится в вашем PATH)

1
ответ дан 27 October 2020 в 12:54

Вам необходимо определить дисплей как среду и запускать его после запуска диспетчера дисплея.

См. содержание ниже.

[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.

0
ответ дан 1 November 2020 в 19:22

Другие вопросы по тегам:

Похожие вопросы: