У нас есть встроенная целевая среда (отдельно от среды сборки хоста), в которой работает systemd
, но не cron
.Как использовать systemd для замены заданий cron, предназначенных для запуска каждые пять минут?
У нас также есть сценарий, который в большинстве систем я бы просто создал запись cron
для запуска ее каждые пять минут.
Теперь я знаю, как создать сервис под номером systemd
, но этот сценарий является одним выстрелом, который выходит после того, как он выполнил свою работу. То, что я хотел бы сделать, это запустить его сразу при загрузке (после syslog.target
, конечно), затем каждые пять минут после этого.
После прочтения на systemd
таймеров, я создал следующий файл сервис /lib/systemd/system/xyzzy.service
:
[Unit]
Description=XYZZY
After=syslog.target
[Service]
Type=simple
ExecStart=/usr/bin/xyzzy.dash
и приравненные /lib/systemd/system/xyzzy.timer
:
[Unit]
Description=XYZZY scheduler
[Timer]
OnBootSec=0min
OnUnitActiveSec=5min
[Install]
WantedBy=multi-user.target
К сожалению, при загрузке цели, таймер не отображается для начала, поскольку вывод systemctl list-timers --all
не включает его. Запуск блока таймера вручную, похоже, работает нормально, но это то, что должно запускаться автоматически с вмешательством пользователя.
Я бы подумал, что WantedBy
обеспечит установку и запуск таймера, и поэтому он будет запускать службу периодически. Однако я заметил, что каталог multi-user.target.wants
фактически не имеет символической ссылки для таймера.
Как это делается в systemd
?
Это довольно раздражает. Учитывая, что вся цель 'systemd' заключается в том, чтобы обрабатывать операции запуска, нам нужно либо вручную запустить ее, либо использовать какое-то другое средство * времени загрузки для этого? Возможно, я не сделал этого очевидным в вопросе, но целевая среда не зависит от разработки, поэтому не просто выполнить это на моем dev-боксе, так как это не повлияет на цель. Что мне нужно сделать, так это обеспечить цель, после загрузки, сделать это без вмешательства. Немного разочаровывает то, что 'systemd', похоже, не делает этого самостоятельно, основываясь на обширных файлах модулей. – paxdiablo
Как видно из системных документов, функция подпрограммы 'enable' состоит в том, чтобы запускать команды в разделе' [Install] 'файла Unit. Обычно это означает, что устройство автоматически запускается при загрузке. После того, как устройство включено, оно начнется с * каждой загрузки, не требуется ручное вмешательство. –
Марк, я не уверен, что я был чист. Мне кажется, что 'systemd' должен отлично справляться со строфой в единичном файле. Учитывая, что * загружает * эти файлы блоков из известного места во время загрузки, такой вариант был бы неоценим для целевых систем, а не полагался бы на какой-либо другой метод. Кажется, нет никакого способа заставить 'systemd' делать это иначе, чем создавать символические ссылки в целевой файловой системе, подобно тому, что делает' enable'. Я не осуждал ваш ответ, просто комментируя, что это недостаток. – paxdiablo