Путаница с системным таймером

Путаница с системным таймером

У меня есть программа, запущенная через Systemd, и я пытаюсь понять, как запускать/останавливать ее в определенное время. Это постоянная программа (передача).

В настоящее время у меня есть crontab со следующими строками:

0 8 * * * systemctl stop transmission-daemon
0 20 * * * systemctl start transmission-daemon

Я пытаюсь перевести это в файл таймера Systemd.

Кроме того, возможно ли заставить systemd (или cron) проверять, должна ли служба работать или нет, на основе текущего времени в случае перезагрузки?

Спасибо за помощь, если это уже спрашивалось, пожалуйста, укажите мне конкретные примеры именно такого рода вещей. Большинство того, что я могу найти, это как запустить службу с 15-минутными интервалами и тому подобное.

решение1

Может быть проще иметь таймер, который запускает скрипт раз в час и при перезагрузке, и этот скрипт проверяет, является ли текущий час тем, в котором демон должен быть запущен или нет, а затем, если необходимо (возможно, после проверки systemctl is-active $service), запускает или останавливает службу. Этот скрипт также может проверять наличие файла или действовать на основе другой бизнес-логики, чтобы определить, нужно ли что-то запускать или нет, например, файл touch ~/.fooservice-do-not-runможет что-то отключить, или слишком ли высока нагрузка и т. д.

решение2

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

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

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

сон.сервис:

[Unit]
Description=Test service not doing anything real.
Conflicts=sleepoff.service

[Service]
ExecStart=/usr/bin/sleep 1d

Таймер сна:

[Unit]
Description=Timer to start the sleep service.

[Timer]
OnCalendar=*:0/2

sleepoff.service:

[Unit]
Description=Dummy service "running" when the real unit is off.
Conflicts=sleep.service

[Service]
Type=oneshot
ExecStart=/usr/bin/true
RemainAfterExit=true

таймер отключения сна:

[Unit]
Description=Timer to stop the sleep service.

[Timer]
OnCalendar=*:1/2

Связанный контент