Запускать / останавливать systemd.service в определенное время

14

Я хочу запустить и остановить systemd.service в определенное время. Предположительно я буду использовать модуль .timer для запуска задания, но есть ли встроенный способ остановить задание по истечении определенного времени или в определенное время , или мне нужно создать второй модуль .timer, который будет выполнять stop?

Благодарность

Джейми Китсон
источник

Ответы:

6

Чтобы остановить службу A с помощью таймера, вы можете создать службу типа B, с oneshotкоторой она будет конфликтовать , а затем использовать таймер для запуска службы B.

Если юнит имеет настройку Conflicts = на другом юните, запуск первого остановит последний и наоборот. ( источник )

Услуга:

[Unit]
Conflicts=B.service
...

B.service:

[Unit]
Description=B service description

[Service]
Type=oneshot
ExecStart=/bin/echo ''

B.timer:

[Timer]
AccuracySec=1
OnActiveSec=10

[Install]
WantedBy=timers.target

Следующее остановит службу A через 10 секунд.

systemctl start A.service
systemctl start B.timer
Radivarig
источник
2

Действительно, есть другой способ остановить службу после определенного времени выполнения, настроенного в .serviceфайле.

RuntimeMaxSec=...

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

Чтобы получить лучший ответ, вы можете объяснить свое обоснование использования такой необычной функции. Сервисы, как правило, должны работать вечно или до тех пор, пока они не будут явно остановлены, а не только на фиксированный период времени.

Павел Шимерда
источник
1
Да, мы обсуждали это и его ограничения в списке рассылки: lists.freedesktop.org/archives/systemd-devel/2016-April/…
Джейми Китсон,
1
Не необычно Как насчет запуска ресурсоемкой службы, возможно, SETI, только в ночное время, когда сервер получает наименьшее количество трафика. Кроме того, там, где я работаю, у нас есть демон оповещения, который предназначен для пробуждения группы поддержки через их телефоны, когда на серверах есть исключение. Мы действительно не хотим, чтобы эта надоедливая вещь работала, когда мы на самом деле не спали, потому что у этих серверов были проблемы слева и справа во время пиковой нагрузки.
Джеймс М. Лэй
0

Вы можете использовать несколько заданий cron:

 # ┌───────────── мин (0 - 59) 
 # │ ┌────────────── час (0 - 23)
 # │ │ ┌─────────────── день месяца (1 - 31)
 # │ │ │ ┌──────────────── месяц (1 - 12)
 # │ │ │ │ ┌───────────────── дня недели (0 - 6)
 # │ │ │ │ │
 # │ │ │ │ │
   * * * * * systemctl start $ SERVICE.service
   * * * * * systemctl stop $ SERVICE.service

Дополнительная информация о cron: https://en.wikipedia.org/wiki/Cron , https://wiki.archlinux.org/index.php/Cron

Джон Мун
источник
8
Как работа cron лучше, чем системные .timerмодули, которые OP уже знает?
Павел Шимерда
Я мог бы, да, но мой вопрос действительно заключается в том, как сделать это правильно с systemd? Я предполагаю, что должен быть какой-то стандартный способ заставить работу остановиться в определенное время или через определенное время.
Джейми Китсон
@JamieKitson Честно говоря, я не думаю, что на самом деле должна быть такая функция помимо таймеров cron и systemd. Большинство установок systemd никогда не будут использовать такие функции, и нет ничего плохого в работе с systemctlиспользованием cron, системных таймеров и всего, что вам нравится. На мой взгляд, этот ответ так же действителен, как и любой другой ответ.
Павел Шимерда
как вы разрешаете, например, www-data запускать и останавливать systemctl?
alvaropgl
@alvaropgl Ваш комментарий не имеет никакого отношения к пользователям (www-data) и какому ограниченному доступу они могут запускать / не запускать процессы (systemctl), что и является темой. Пожалуйста, начните новую тему. Подсказка: вы, вероятно, хотите взглянуть на создание API, который будет делать то, что вы хотите, а не на ваш нынешний подход, предусматривающий большую ответственность + возможности для пользователя www-data.
Скотт Прайв