Intereting Posts
есть ли способ подражать git-шоу в mercurial? Синхронизировать почту с помощью offlineimap через службу / таймер systemd; получение пароля из гнома Могу ли я дешифровать файлы EncFS без .encfs6.xml? Как запустить cronjob в моей обычной среде? TrueCrypt ограничивает объем mdadm Перемещение / var для объединения пула fs cd ~ работает в одном сеансе терминала, но не в другом (об ошибке не сообщается) Как скомпилировать исходный код в ядре? Как псевдонимы команды после SSH-соединения с несколькими ходами в одном и том же псевдониме Возможно ли создать общий ресурс NFS из установочного каталога CIFS? применить функцию bash к родительскому охвату имена файлов grep, имена файлов и содержимое сразу? Установка плагина gedit на Fedora Если я буду использовать curl –interface eth1, будет ли он использовать eth1 независимо от метрики? Можно ли повторно добавить удаленное устройство iommu?

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

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

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

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

Мое предпочтительное решение заключалось в том, чтобы каждый час запускать работу, но сам скрипт проверял, пришло ли время запуска или нет, и выходите, не делая ничего 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 часов.