2017-01-10 8 views
0

У нас есть встроенная целевая среда (отдельно от среды сборки хоста), в которой работает 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?

ответ

1

Таймер не активен, пока вы на самом деле не мог:

systemctl enable xyzzy.timer 

Если вы хотите увидеть, как это работает до перезагрузки, вы также можете запустить его:

systemctl start xyzzy.timer 

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

Например (в предположении, SYSROOT идентифицирует корневой каталог целевой файловой системы):

ln -s ${SYSROOT}/lib/systemd/system/xyzzy.timer 
     ${SYSROOT}/lib/systemd/system/multi-user.target.wants/xyzzy.timer 

Это позволит эффективно поставить блок таймера в активированном состоянии для multi-user.target, так systemd начнет его с этой целью ,


Кроме того, обычно ваши пользовательские файлы будут храниться в /etc/systemd/system/. В эквивалентном каталоге lib размещается systemd файлов, установленных пакетами или ОС.

Если это важно, что ваши хроны запускать точно каждые 5 минут, вы должны проверить точность, потому что systemd's monotonic timers can slip over time

+0

Это довольно раздражает. Учитывая, что вся цель 'systemd' заключается в том, чтобы обрабатывать операции запуска, нам нужно либо вручную запустить ее, либо использовать какое-то другое средство * времени загрузки для этого? Возможно, я не сделал этого очевидным в вопросе, но целевая среда не зависит от разработки, поэтому не просто выполнить это на моем dev-боксе, так как это не повлияет на цель. Что мне нужно сделать, так это обеспечить цель, после загрузки, сделать это без вмешательства. Немного разочаровывает то, что 'systemd', похоже, не делает этого самостоятельно, основываясь на обширных файлах модулей. – paxdiablo

+0

Как видно из системных документов, функция подпрограммы 'enable' состоит в том, чтобы запускать команды в разделе' [Install] 'файла Unit. Обычно это означает, что устройство автоматически запускается при загрузке. После того, как устройство включено, оно начнется с * каждой загрузки, не требуется ручное вмешательство. –

+0

Марк, я не уверен, что я был чист. Мне кажется, что 'systemd' должен отлично справляться со строфой в единичном файле. Учитывая, что * загружает * эти файлы блоков из известного места во время загрузки, такой вариант был бы неоценим для целевых систем, а не полагался бы на какой-либо другой метод. Кажется, нет никакого способа заставить 'systemd' делать это иначе, чем создавать символические ссылки в целевой файловой системе, подобно тому, что делает' enable'. Я не осуждал ваш ответ, просто комментируя, что это недостаток. – paxdiablo

 Смежные вопросы

  • Нет связанных вопросов^_^