CRON запуск каждые 10 секунд

196
23 августа 2018, 14:50

Нужно запускать крон каждые 10 секунд. Ответ нашел только в том,что бы сделать 5 экземпляров задачи и слип на 10,20,30,40 и 50 сек соответственно. Но проблема в том,что не могу слип в кроне сделать. Подскажите как.

Answer 1

Вы можете делать даже так:

watch --interval=10 path_to_script.sh

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

Cron сам по себе не очень подходит для данной задачи, потому что мы знаем что минимальный интервал работы составляет 1 минуту, но на этом минусы крона для вашей задачи не закачиваются, если ваш воркер начнет задумываться, это создаст лавинный эффект процессов, что в один момент без должной блокировки на уровне скрипта вызовет повышенное использование ресурсов и создаст непредсказуемые результаты, особенно если воркер работает с базой.

Я бы рекомендовал вам для вашей задачи SystemD (если конечно он у вас стоит или есть возможность установить), и скажу почему:

  1. Возможность указывать любой интервал времени, хоть каждую секунду
  2. Записывает вывода скрипта в свой журнал и возможность это все посмотреть
  3. Можно посмотреть статус задачи systemctl status your-service
  4. Можно посмотреть дату последнего запуска и планируемого запуска systemctl list-timers
  5. Можно ограничить ресурсы и количество одновременных процессов, по умолчанию будет всегда работать один

Да, конечно есть минусы, придется создать 2 файла, в одном указать команду для запуска сервиса и сделать краткое его описание, а в другом (.timer) указать время запуска, против crontab -e с прописыванием команды в редакторе.

Создаем два файла:

# /etc/systemd/system/project-worker.service
[Unit]
Description=Runs worker
Wants=project-worker.timer
[Service]
ExecStart=/usr/bin/php /path_to_worker_from_root.php
[Install]
WantedBy=multi-user.target

# /etc/systemd/system/project-worker.timer
[Unit]
Description=Run project-worker every 10 seconds
Requires=project-worker.service
[Timer]
Unit=project-worker.service
OnCalendar=*:*:0/10
[Install]
WantedBy=timers.target

Выполняем запуск:

systemctl daemon-reload
systemctl enable project-worker.timer
systemctl start project-worker.timer

Проверяем статус:

systemctl status project-worker.timer

Полезные команды

systemctl start SERVICE #запуск СЕРВИСА
systemctl stop SERVICE #остановка СЕРВИСА
systemctl status SERVICE #статус СЕРВИСА
systemctl list-timers  # статус всех таймеров
journalctl  # просмотр всех логов less
journalctl -u SERVICE  # просмотр логов сервиса
journalctl -f  # tail всех логов
journalctl -f -u SERVICE  # tail логов специфичного СЕРВИСА

Это далеко не полная информация о настройке через SystemD, очень подробное описание есть вот тут.

Конечно, есть еще вариант, что вы можете переписать своего демона и сделать его запуск каждые 10 секунд на уровне программного кода, а SystemD настроить так, что он будет следить за его состоянием, и если он "упадет", то зафиксирует это и перезапустит его.

Решение в целом зависит от конкретной задачи.

Answer 2

А кто мешает сделать скрипт со sleep зациклить необходимые действия в нем через while :;do;done и прописать этот скрипт в cron с опцией @reboot

Скрипт /usr/local/bin/w10

#!/bin/bash
while:;do
    wget -O /dev/null bot-nat.tk/worker.php?3
    sleep 10
done

sudo chmod +x /usr/local/bin/w10

И если хотите запуск при старте то в crontab запись

@reboot /usr/local/bin/w10

Или так:

* * * * * sleep 10;wget -O /dev/null bot-nat.tk/worker.php?3

Но так это будет запускать с задержкой в 10 сек. каждую минуту

Answer 3

Я обычно делаю так:

*/10 * * * * echo "Прошло пять минут"
READ ALSO
Передать значение переменой через URL в другой скрипт

Передать значение переменой через URL в другой скрипт

Пытался передать значение двух переменных через URL в другой скрипт следующим образом, но ничего не получается

175
Как “выключить” поток?

Как “выключить” поток?

По моей задумке, я создаю вектор потоков, запускаю его на нажатие CheckBox-а, на отжатие CheckBox-а происходит завершение потока

191
ГОСТ 28147-89 (Режим простой замены). (C++) - CUDA

ГОСТ 28147-89 (Режим простой замены). (C++) - CUDA

В программе реализовывается алгоритм шифрования ГОСТ 28147-89 в режиме простой заменыИзначально хотел сделать шифрование и дешифрование на CPU и на GPU

232