Запустити / зупинити systemd.service у визначений час


14

Я хочу запустити і зупинити systemd.service в певний час. Імовірно, я буду використовувати .timer підрозділ для початку роботи, але чи є вбудований спосіб зупинити роботу після певної тривалості, або в певний час , або мені потрібно створити другий блок .timer, який виконує stop?

Спасибі

Відповіді:


6

Щоб зупинити службу A за допомогою таймера, ви можете створити службу типу B, з oneshotякою вона буде суперечити , а потім скористатися таймером для запуску служби B.

Якщо у підрозділу є налаштування Conflicts = на іншому блоці, запуск першого зупинить другий і навпаки. ( джерело )

A. сервіс:

[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

2

Ви можете скористатись декількома завданнями з керування:

 # ┌───────────── min (0 - 59) 
 # │ ┌────────────── година (0 - 23)
 # │ │ ┌─────────────── день місяця (1 - 31)
 # │ │ │ ┌──────────────── місяць (1 - 12)
 # │ │ │ │ ┌───────────────── день тижня (0 - 6)
 # │ │ │ │ │
 # │ │ │ │ │
   * * * * * systemctl start $ SERVICE.service
   * * * * * systemctl стоп $ SERVICE.service

Більше інформації про cron: https://en.wikipedia.org/wiki/Cron , https://wiki.archlinux.org/index.php/Cron


8
Яким чином робота з Cron є вдосконаленням системних .timerпідрозділів, про які вже знає ОП?
Павло Шімерда,

Я міг би так, але моє запитання справді полягає в тому, як це зробити правильно з системою? Я припускаю, що повинен бути якийсь стандартний спосіб, щоб робота припинилася в певний час або через певну тривалість.
Джеймі Кітсон

@JamieKitson Якщо чесно сказати, я не думаю, що насправді не повинно бути такої особливості за межами кроменів та системних таймерів. Більшість системних інсталяцій ніколи не використовуватиме такі функції, і немає нічого поганого в роботі із systemctlвикористанням крона, системних таймерів і будь-чого, що вам подобається. На мою думку, ця відповідь є такою ж справедливою, як і будь-яка інша відповідь.
Павло Шимерда

як ви дозволяєте, наприклад, www-data запускати systemctl запуск і зупинку?
alvaropgl

@alvaropgl Ваш коментар не має нічого спільного з користувачами (www-data) і який обмежений доступ вони можуть мати для запуску / не запуску процесів (systemctl), що є темою. Будь ласка, почніть нову тему. Підказка: ви, мабуть, хочете поглянути на те, щоб зробити API, щоб робити те, що ви хочете, а не ваш сучасний підхід щодо забезпечення більшої відповідальності та сфери застосування для користувача www-data.
Скотт-

2

Дійсно, є ще один спосіб зупинити службу після певного часу виконання, налаштованого у .serviceфайлі.

RuntimeMaxSec=...

Можливо, вам не сподобається те, що сервіс вважається невдалим, але це більш-менш логічний результат вбивства тривалої служби.

Щоб отримати кращу відповідь, ви можете пояснити своє обґрунтування використання такої незвичної функції. Послуги, як правило, призначені для роботи назавжди або до того моменту, коли вони будуть явно зупинені, а не лише протягом певного часу.


1
Так, ми обговорювали це та його обмеження у списку розсилки: list.freedesktop.org/archives/systemd-devel/2016-April/…
Джеймі Кітсон

1
Незвично. Як щодо запуску служби, що вимагає ресурсів, можливо SETI, лише вночі, коли сервер отримує найменший трафік. Крім того, де я працюю, у нас є демон-попереджувач, призначений розбудити команду підтримки по своїх телефонах, коли на серверах є виняток. Ми дійсно не хочемо, щоб ця дратівлива річ працювала тоді, коли ми насправді прокинулися, оскільки ці сервери мають проблеми ліворуч та праворуч під час пікового використання.
Джеймс М. Лежав
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.