Я хочу выполнять скрипт оболочки буквально через каждые 3 дня. Использование crontab с 01 00 */3 * *
фактически не выполнит условие, потому что оно будет работать 31-го числа, а затем снова 1-го числа месяца. */3
Синтаксис такой же , как говорят 1,4,7 ... 25,28,31.
Должны быть способы заставить сам скрипт проверить условия и выйти, если не прошло 3 дня. Таким образом, crontab выполняет скрипт каждый день, но сам скрипт проверяет, прошло ли 3 дня.
Я даже нашел некоторый код, но он дал мне синтаксическую ошибку, любая помощь будет оценена.
if (! (date("z") % 3)) {
exit;
}
main.sh: line 1: syntax error near unexpected token `"z"'
main.sh: line 1: `if (! (date("z") % 3)) {'
command-line
bash
scripts
cron
Таави
источник
источник
*/3
не работает? «если 3 дня не прошло»: три дня с чего? Пожалуйста, отредактируйте свой вопрос и уточните .date("z") % 3 == 0
может пострадать от аналогичной проблемы: условие будет ложным в течение четырех дней с 29 декабря по 3 января, если только этот декабрь не будет частью високосного года.Ответы:
Чтобы немедленно прервать и закрыть скрипт, если последнее выполнение еще не было хотя бы определенного времени назад, вы можете использовать этот метод, для которого требуется внешний файл, в котором хранятся дата и время последнего выполнения.
Добавьте эти строки в начало вашего скрипта Bash:
Не забудьте установить значимое значение
datefile=
и адаптировать значениеseconds=
к вашим потребностям ($((60*60*24*3))
оценивается до 3 дней).Если вам не нужен отдельный файл, вы также можете сохранить время последнего выполнения в метке времени изменения вашего скрипта. Это означает, однако, что при внесении любых изменений в ваш файл скрипта счетчик 3 будет сброшен и будет рассматриваться, как если бы скрипт был успешно запущен.
Чтобы реализовать это, добавьте приведенный ниже фрагмент вверху файла скрипта:
Опять же, не забудьте адаптировать значение
seconds=
к вашим потребностям ($((60*60*24*3))
оценивается в 3 дня).источник
$[ $(date +%s) - $(< lastrun) ]
. Если скрипт запускается из cron один раз в день, я мог бы добавить некоторый провал к необходимому временному интервалу, чтобы, если выполнение скрипта задерживается на пару секунд, следующий раз не пропустил полный день. Это проверка каждый день, если прошло 71 час.Cron действительно не тот инструмент для этого. Там на самом деле широко используются и underloved инструмента под названием в каком могут работать. Он в основном предназначен для интерактивного использования, и я уверен, что кто-то найдет лучший способ сделать это.
В моем случае я бы запустил скрипт, который я запускаю, в testjobs.txt и включил в себя строку, которая гласит:
В качестве примера я хотел бы иметь это как testjobs.txt
У меня есть две невинные команды, которые могут быть вашими сценариями. Я запускаю echo, чтобы убедиться, что у меня есть детерминированный вывод, и дата подтверждения команды запускается при необходимости. Когда at запускает эту команду, она завершает добавление нового задания в at в течение 3 дней. (Я проверял с одной минутой - который работает)
Я уверен , что я буду окликнул за то , как я злоупотреблял в, но удобный инструмент для планирования команды , которая будет работать в то время , или х дни после предыдущей команды.
источник
at
кажется, лучший подход здесь. Проблема с этим подходом заключается в том, что каждый раз, когда вы вручную запускаете скрипт, вы добавляете другой наборat
задач каждые 3 дня .at
находится наверху, или, возможно, намного больше, если онat
находится внизу сценария длительного исполнения)Во-первых, приведенный выше фрагмент кода имеет недопустимый синтаксис Bash, выглядит как Perl. Во-вторых,
z
параметрdate
заставляет его выводить числовой часовой пояс.+%j
это номер дня. Тебе нужно:Но вы все равно увидите странность в конце года:
Возможно, вам повезет больше с сохранением счета в файле и его проверкой / обновлением.
источник
date()
встроенной функции, но это немного похоже на date () в PHP (гдеz
«день года (начиная с 0)»)Если вы можете просто оставить скрипт запущенным постоянно, вы можете сделать:
Этот цикл всегда имеет значение true, поэтому он всегда будет выполнять код, затем подождать три дня, прежде чем снова запустить цикл.
источник
while true
?at
решение, это будет дрейфовать временем выполнения сценария при каждом запуске. Конечно, это можно обойти, сэкономив время, когда скрипт запускается и спит до 3 дней.Вы можете использовать анакрон вместо cron, он предназначен именно для того, что вам нужно. Из справочной страницы:
источник