Я совсем новичок в 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.