Как я могу начать cronjob через 1 час каждый день?

Мне нужно начинать cronjob каждый день, но через час каждый день. То, что я до сих пор работает по большей части, за исключением 1 дня в году:

0 0 * * * sleep $((3600 * (10#$(date +\%j) \% 24))) && /usr/local/bin/myprog 

Когда в день года будет 365, работа начнется в 5:00, но на следующий день (не считая високосного года) будет день года как 1, поэтому работа начнется в 1:00. Как я могу избавиться от этого углового случая?

  • cron из нескольких файлов
  • Начало работы Crontab +1 мин после @reboot
  • Cron несколько скриптов каждые 5 минут с 10 секундами между каждым скриптом
  • В чем цель использования разных crontab для каждого пользователя?
  • почему /etc/cron.hourly/myjob не работает?
  • Вручную запустить задание cron / имитировать работу cron?
  • Почему эта работа crontab не работает
  • Что делает * / 13 в crontab?
  • 3 Solutions collect form web for “Как я могу начать cronjob через 1 час каждый день?”

    Мое предпочтительное решение заключалось в том, чтобы каждый час запускать работу, но сам скрипт проверял, пришло ли время запуска или нет, и выходите, не делая ничего 24 раза из 25.

    кронтаб:

     0 * * * * /usr/local/bin/myprog 

    в верхней части myprog :

     [ 0 -eq $(( $(date +%s) / 3600 % 25 )) ] || exit 0 

    Если вы не хотите вносить какие-либо изменения в сам скрипт, вы также можете поставить «время для запуска» в записи crontab, но это делает длинную неприглядную строку:

     0 * * * * [ 0 -eq $(( $(date +\%s) / 3600 \% 25 )) ] && /usr/local/bin/myprog 

    Если ваша система имеет systemd, вы можете использовать для этого события таймеров. Просто определите новую службу , которая должна содержать команду / задачу, которую вы хотите выполнить, а затем создайте событие таймера с опцией OnUnitActiveSec :

     [Unit] Description=daily + 1 hour task [Timer] OnUnitActiveSec=25h # run 25 hours after service was last started AccuracySec=10min [Install] WantedBy=timers.target 

    Используйте одно и то же имя для файлов, за исключением того, что вместо .service вы используете .timer .

    Синтезирующий:

    1. Создайте файл с именем job.service в job.service /etc/systemd/system/ .
    2. Заполните его необходимой информацией. Вы можете проверить конфигурацию, используя systemctl status job.service .
    3. Создайте файл с именем job.timer в /etc/systemd/system/ .
    4. Заполните его необходимой информацией:

       [Unit] Description=daily + 1 hour task [Timer] OnUnitActiveSec=25h # run 25 hours after service was last started AccuracySec=10min [Install] WantedBy=timers.target 
    5. Проверка таймера с использованием systemctl list-timers
    6. Готово.

    Если вы не против использовать что-то другое, кроме cronjobs, я бы предложил менее известную утилиту. Просто напишите сценарий оболочки, который оба планируют запускать через 25 часов, а затем вызывает вашу программу. Это кажется самым чистым решением.
    Например, вы можете записать это в ~ / script.sh:

     echo "bash ~/script.sh" | at now + 25 hours /usr/bin/yourprogram 

    А затем просто запустите bash ~/script.sh один раз.

    Благодаря @HalosGhost за идею планирования работы раз в 25 часов.

    Linux и Unix - лучшая ОС в мире.