LINUX.ORG.RU

systemd запуск по расписанию.

 ,


0

1

Добрый день! Подскажите, что делаю не так. Хочу через systemd запускать sh скрипт раз в секунду, написал service и timer. Вот содержимое:

.service:

[Unit]

Description=test

[Service]

Type=oneshot

ExecStart=-/opt/scripts/1.sh

.timer:

[Unit]

Description=test

[Timer]

OnCalendar=*:*:0/1

[Install]

WantedBy=timers.target

В запускаемом скрипте сделал лог времени запуска и все. Так он стартует, когда захочет, время регистрируется с разным интервалом. При этом если я начинаю в консоль спамить команду опроса таймеров - systemctl list-timers, он показывает каждый раз что ему осталось сколько там милисекунд до запуска и в логе скрипта видно, что он отрабатывает каждую секунду.

В чем загвоздка?



Последнее исправление: lasthappy (всего исправлений: 1)

Mon Jan 30 15:27:50 MSK 2017

Mon Jan 30 15:27:53 MSK 2017

Mon Jan 30 15:28:22 MSK 2017

Mon Jan 30 15:28:54 MSK 2017

Mon Jan 30 15:28:54 MSK 2017

Mon Jan 30 15:29:32 MSK 2017

Mon Jan 30 15:29:53 MSK 2017

Mon Jan 30 15:30:24 MSK 2017

Mon Jan 30 15:30:53 MSK 2017

Mon Jan 30 15:31:06 MSK 2017

Mon Jan 30 15:31:15 MSK 2017

Mon Jan 30 15:31:52 MSK 2017

Mon Jan 30 15:31:53 MSK 2017

Mon Jan 30 15:31:58 MSK 2017

Mon Jan 30 15:32:01 MSK 2017

Mon Jan 30 15:32:02 MSK 2017

Mon Jan 30 15:32:03 MSK 2017

Mon Jan 30 15:32:04 MSK 2017

Mon Jan 30 15:32:05 MSK 2017

В начале лога видно время запуска. А вот в конце видно, что он старутет каждую секунду. Это как раз в то время, когда я спамлю в консоль команду systemctl list-timers

lasthappy
() автор топика

потому что по умолчанию AccuracySec=1min (а также смотри DefaultTimerAccuracySec=1min)
но для твоей задачи лучше убрать OnCalendar и поставить OnActiveSec=1s

bass ★★★★★
()
Последнее исправление: bass (всего исправлений: 2)

Подскажите, что делаю не так.

игнорируешь LORCODE

surefire ★★★
()
Ответ на: комментарий от lasthappy

Выставил DefaultTimerAccuracySec=1s

Это не опция таймера, а глобальная опция из файла конфигурации systemd, тебе её трогать не надо, тем более, что 1s — это не то, что ты хочшь. Тебе надо в таймер добавить AccuracySec=1us.

redgremlin ★★★★★
()
Последнее исправление: redgremlin (всего исправлений: 1)

Если у тебя нет серьезных причин (вроде самообучения) пытаться сделать это через systemd, то для такого короткого интервала правильным будет ежесекундно в цикле вызывать твой скрипт из другого скрипта:

while true; do
  /opt/scripts/1.sh
  sleep 1
done

kawaii_neko ★★★★
()

Неправильно понял твою проблему и неверно подсказал OnActiveSec
Вот так должно работать как тебе нужно
foo.service

[Unit]
Description=foo service

[Service]
Type=oneshot
StartLimitBurst=0
ExecStart=/usr/bin/sh -c '/usr/bin/date >> /tmp/foo.log'

foo.timer
[Unit]
Description=foo timer

[Timer]
AccuracySec=1us
OnCalendar=*:*:0/1

[Install]
WantedBy=timers.target

bass ★★★★★
()
Последнее исправление: bass (всего исправлений: 1)
Ответ на: комментарий от bass

Да, благодарю, уже разобрался У меня 5 итераций работало, 5 пропускало. Сменил StartLimitBurst и вс стало ок, только я в глобалном конфиге менял

lasthappy
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.