
У меня есть программа, запущенная через 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