LINUX.ORG.RU

Написание сервиса пользователя

 


1

1

Поясните пожалуйста по написанию сервисов. Не понимаю как добиться работоспособности сервисов созданных и запущенных от пользователя.

Создал два файла сервиса в папке пользователя ~./config/systemd/system/user/

lock_screen_when_lid_close@.service

[Unit]   
Description=i3lock on suspend
Before=sleep.target

[Service]
User=%i
Environment=DISPLAY=:0
Type=oneshot
ExecStart=/usr/bin/pkill picom
ExecStart=/usr/bin/bash %h/.config/i3/scripts/i3lock.sh
TimeoutSec=10

[Install]
WantedBy=sleep.target

picom_start@.service

[Unit]
Description=Picom start after sleep
After=sleep.target

[Service]
User=%i
Type=forking
Environment=DISPLAY=:0
ExecStart=/usr/bin/picom -r15 -b

[Install]
WantedBy=sleep.target

Всё, что прописано после ExecStart спокойно выполняется с правами пользователя.

Создал юниты и перезагрузил

systemctl --user enable lock_screen_when_lid_close@dima.service 
systemctl --user enable picom_start@dima.service
systemctl --user daemon-reload    

Пробовал запускать сервисы после этого, но не запускается, по запросу status кажет ошибки. Что в ошиках боле менее понятно, но неясно почему такие ошибки и как исправить.
$ systemctl –user status lock_screen_when_lid_close@dima.service

● lock_screen_when_lid_close@dima.service - i3lock on suspend
     Loaded: loaded (/home/dima/.config/systemd/user/lock_screen_when_lid_close@.service; enabled; vendor preset: enabled)
     Active: failed (Result: exit-code) since Wed 2020-01-01 09:03:55 MSK; 4min 52s ago
   Main PID: 24414 (code=exited, status=216/GROUP)

янв 01 09:03:55 ARCH systemd[1231]: Starting i3lock on suspend...
янв 01 09:03:55 ARCH systemd[24414]: lock_screen_when_lid_close@dima.service: Failed to determine supplementary groups: Operation not permitted
янв 01 09:03:55 ARCH systemd[24414]: lock_screen_when_lid_close@dima.service: Failed at step GROUP spawning /usr/bin/pkill: Operation not permit>
янв 01 09:03:55 ARCH systemd[1231]: lock_screen_when_lid_close@dima.service: Main process exited, code=exited, status=216/GROUP
янв 01 09:03:55 ARCH systemd[1231]: lock_screen_when_lid_close@dima.service: Failed with result 'exit-code'.
янв 01 09:03:55 ARCH systemd[1231]: Failed to start i3lock on suspend.

$ systemctl –user status picom_start@dima.service

● picom_start@dima.service - Picom start after sleep
     Loaded: loaded (/home/dima/.config/systemd/user/picom_start@.service; enabled; vendor preset: enabled)
     Active: inactive (dead)

Эти же сервисные файлы расположенные в /etc/systemd/system/
работают, но нестабильно. Бывает сервис не срабатывает. Кроме того сервис lock_screen_when_lid_close@dima.service
пытается выполнить строку запуска от root

ExecStart=/usr/bin/bash %h/.config/i3/scripts/i3lock.sh    

Но юнит был создан для пользователя systemctl enable lock_screen_when_lid_close@dima.service
Если прописать явно имя пользователя и команду запуска i3lock вместо скрипта, то срока отрабатывает нормально.


(запускаю свой секретный wrapper i3lock, ошибки)

(запускаю i3lock напрямую, нет ошибок)

О господи, куда же копать?… Полюбому виноват systemd!

t184256 ★★★★★
()
Последнее исправление: t184256 (всего исправлений: 1)

User=%i

Эта опция только для рута, потому что только рут может выполнять под другим пользователем. У тебя и так она будет выполняться под твоим пользователем.

gremlin_the_red ★★★★★
()

Пользовательские юниты не могут зависеть от любых системных.

anonymous
()
Ответ на: комментарий от gremlin_the_red

Убрав User=%i из picom_start@.service, сервис отлично запускается. Т.е. строка выполняется: ExecStart=/usr/bin/picom -r15 -b

Почему в другом файле сервиса не срабатывают строки, мне не ясно. ExecStart=/usr/bin/pkill picom ExecStart=/usr/bin/bash %h/.config/i3/scripts/i3lock.sh

dima81
() автор топика
Ответ на: комментарий от dima81

ExecStart=/usr/bin/bash %h/.config/i3/scripts/i3lock.sh

А зачем здесь /usr/bin/bash?
Можно же сразу ExecStart=/путь/к/скрипту

bowtda
()
Ответ на: комментарий от dima81

В первом сообщении тебе намекнули на причину — она может быть в скрипте i3lock.sh Например, ты можешь не учитывать, что у тебя не установлены переменные окружения.

gremlin_the_red ★★★★★
()

Подниму заново тему.
Переписал сервисы и расположил их в /etc/systemd/system/
Скрипты которые исполняют сервисы расположил в /usr/local/bin
Права скриптам выставлены, флаг запуска тоже.
Сервисы включаются для пользователя systemctl enable to_wakeup@dima.service

Но пока не могу добиться стабильной работы сервиса при выходе из ждущего режима. Странность работы заключается в том, что при нахождении компа в ждущем режиме ночью, т.е. несколько часов сервис не стартует при просыпании. Если комп перевести в ждущий режим, разбудить минут через 10, то сервис стартует.
В чём может быть причина такой работы сервиса?

$ cat /etc/systemd/system/to_wakeup@.service

[Unit]
Description=Picom start after suspend
After=sleep.target

[Service]
User=%i
Type=forking
Environment=DISPLAY=:0
ExecStart=/usr/bin/bash /usr/local/bin/to_wakeup.sh

[Install]
WantedBy=sleep.target

$ cat /usr/local/bin/to_wakeup.sh

#!/bin/bash
# Script for service to_wakeup
picom -C -b &&
sleep 1s
while !(pgrep -x 'picom'); do
picom -C -b &&
sleep 1s; 
done
sleep 1s
exit 0
dima81
() автор топика
Последнее исправление: dima81 (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.