Как написать пользовательскую службу systemd, требующую активного сеанса

Для этого есть команда; он называется tee :

users | tee file | wc -w

PS. (Внешние) команды не различаются между оболочками; Синтаксис перенаправления ввода и вывода различается.

1
08.05.2018, 19:04
2 ответа

tl;dr (краткий ответ)

Я считаю, что такого пути не существует, по крайней мере из -из -блока -(в виде директивы модуля systemd или что-то в этом роде ). Однако это, безусловно, выполнимо вне systemd.

длинный ответ

Было бы неплохо, если бы systemd поддерживала запуск по событию -на основе (по аналогии с udev )или позволяла настраивать автоматически -сгенерированные юнит-файлы. Любая идея, если она будет реализована, решит эту проблему, но на самом деле обе являются давними -недостатками systemd.

Вы можете попытаться реализовать эту логику самостоятельно. Если я правильно понимаю, чего вы на самом деле пытаетесь достичь, вам нужна семантика «отсрочки» запуска -до тех пор, пока сеанс не станет активным, а не «пропуск» запуска -, если сеанс неактивен, когда срабатывает таймер.

Тогда основной идеей будет иметь демон, который запускается как пользовательская служба systemd, прослушивает события изменения состояния logind на системной шине и соответственно запускает/останавливает таймер. Это должно быть легко выполнимо в Python (, к сожалению, о bash не может быть и речи, потому что нет дружественных к оболочке -инструментов, позволяющих прослушивать сигналы на шине D -).

0
27.01.2020, 23:43

Похоже (из строки USER=$(whoami)в вашем скрипте ), что вы запускаете эту службу как не -пользователь root (, вероятно, установив User=в файле daily-backup.service.)

Возможно, вы захотите настроить службы и таймеры как пользовательские службы, вместо этого запускаемые менеджером systemd --user.

Для этого просто создайте daily-backup.serviceи daily-backup.timerв каталоге ~$USER/.config/systemd/user/. По сути, вы можете использовать файлы, которые вы создали в системном каталоге, по большей части без изменений. (Вы можете удалить ссылку на User=, так как это будет пользователь, для которого вы ее настраиваете.)

Используйте команды systemctl --user...для их включения и запуска, а также для проверки состояния. Для раздела установки используйте:

[Install]
WantedBy=default.target

Поскольку менеджер пользователей знает только о default.target(, а не, например. multi-user.target.)

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

loginctl enable-linger $USER

(См. документацию по loginctl enable-linger.)

На самом деле, глядя на статью в журнале Fedora Magazine, на которую вы ссылались, кажется, что именно это они и имели в виду. Часть «Автоматизация с помощью таймера» содержит ссылки на $HOME/.config/systemd/user/.

Если вы хотите узнать больше о юнитах пользователя systemd, в Arch Linux Wiki есть хорошая статья об этом .

1
27.01.2020, 23:43

Теги

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