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

1 ответ1

9

Использование 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.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .