Как запустить службу systemd после входа пользователя и остановить его перед выходом пользователя

10

У меня есть машина Fedora 23.

У меня есть скрипт bash для синхронизации каталогов / файлов, который синхронизирует мой локальный / домашний каталог с удаленным каталогом (на компьютере NAS). Я запускаю его вручную, но я хотел бы создать службу systemd и сделать ее более гибкой, поскольку другие люди используют мой компьютер со своими учетными данными пользователя, я хотел бы знать, когда пользователь вошел в систему, и впоследствии запустить мою службу.

Могу ли я что-то сделать из системного файла моей службы, или мне нужно будет это проверить из своего кода в скрипте?

Мне нужно только убедиться, что у меня есть доступ к переменным среды (например, $ USER) и запустить его как сервис.

Моим основным источником документации является эта ссылка https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/System_Administrators_Guide/sect-Managing_Services_with_systemd-Unit_Files.html

GeorgeKaf
источник
Работает ли systemctl --userна F23?
user1686
Я так думаю, он возвращает список и сообщение 76 loaded units listed.
GeorgeKaf
Вот еще один подход, который может работать для вас: unix.stackexchange.com/a/109270/111707 Напишите небольшой скрипт на Python, который вы запускаете .bashrcпри входе в систему, затем он прослушивает сигнал выхода из системы Gnome и выключается.
Янв
@IanB Спасибо, я проверю это. Никогда не больно иметь что-то подобное вокруг.
GeorgeKaf

Ответы:

15

Использование systemd уже включает поддержку пользовательских сессий, фактически вы уже должны зависеть от этого (невольно).

Создать сервисный каталог

mkdir -p $HOME/.local/share/systemd/user

Создать редактировать файл сервиса (vim, gedit, geany - все, что вы хотите)

vim $HOME/.local/share/systemd/user/my.service

Примерно так должно выглядеть, если это постоянный сервис.

[Unit]
Description=My very own Service
[Service]
Type=simple
TimeoutStartSec=0
ExecStart=/path/to/start/script arguments
[Install]
WantedBy=default.target

Но это звучит так, как будто вы хотите запустить его один раз, а затем хорошо с этим справиться, поэтому лучше использовать конфигурацию с одним снимком, подобную этой:

[Service]
Type=oneshot
RemainAfterExit=true
StandardOutput=journal
ExecStart=/path/to/start/script arguments
ExecStop=/path/to/stop/script arguments
[Install]
WantedBy=default.target

Это, конечно, предполагает, что ваш скрипт исполняемый, то есть:

chmod a+x /path/to/start/script
chmod a+x /path/to/stop/script

В противном случае вам необходимо указать путь к соответствующему интерпретатору:

ExecStart=/bin/bash /path/to/start/script arguments

Теперь перезагрузите systemd (и заново войдите в систему для тестирования)

systemctl --user enable my.service # enables the service
systemctl --user # should display your new unit in the list
journalctl --user should show the log

Если вам нужна дополнительная информация, обратитесь к Arch-Wiki, например. В этой ветке аскубунту есть разные идеи, в том числе и моя.

Вы можете распространить поведение (если вы являетесь пользователем root) на других пользователей, определив сервис глобально. Для этого вам нужно создать файл службы в / usr / share / systemd / user /, а не в $ HOME / .local / share / systemd / user .

апх
источник
1
привет, ответ был хорош Но это будет работать только в том случае, если служба будет запущена при первом входе в систему и остановлена ​​при последнем сеансе пользователя.
Анвар
4
Вам нужен флаг --user при включении сервиса. "systemctl --user enable my.service"
blushrt
0

Я знаю это несколько лет, но ответ от беспокойства просто помог мне. Так что, я думаю, это все еще полезно. Кроме того, это скорее комментарий, но у меня нет этой привилегии, поэтому я публикую его как «ответ». Во всяком случае...

Запустив Linux Mint 19, я не смог «включить» службу, когда скрипт находился в «$ HOME / .local / share / systemd / user». Попытка сделать это всегда приводила к ошибке. Однако я мог бы запустить его из каталога $ HOME / .local / share / systemd / user. После перемещения скрипта в / usr / share / systemd / user / systemd разрешил мне включить его без проблем.

notorious.dds
источник