В Linux было бы возможно запустить скрипт каждый день на 3 минуты позже, чем предыдущий день?

Выполненный ниже команд снова и проверки...

sudo /etc/init.d/apache2 stop
sudo apt-get remove --purge apache2 php5
sudo apt-get remove --purge libapache2-mod-php5
sudo apt-get install php5 apache2 libapache2-mod-php5
sudo /etc/init.d/apache2 start
sudo a2enmod php5
sudo /etc/init.d/apache2 force-reload
4
04.06.2012, 07:28
3 ответа

Можно использовать at управляйте из своего сценария (или обертка). Дайте ему время для выполнения следующего повторения.

echo '/dir/scriptname' | at 'now + 1443 minutes'

Помещенный, что строка, почти возможная к началу сценария уменьшить дрейф.

5
27.01.2020, 20:51
  • 1
    Это - отличное решение! Но не был бы, это должно быть 'now + 24 hours + 3 minutes'? –   04.06.2012, 07:54
  • 2
    @Elmer: ой! Вы корректны (за исключением того, что Вы не можете сделать рабочего дополнения). Я отредактирую свой ответ. –  Paused until further notice. 04.06.2012, 07:55
  • 3
    Для предотвращения дрейфа скажите сценарий, во сколько он, как предполагается, выполняет и позволяет ему добавить 24-е 3 м к этому. –  Keith Thompson 04.06.2012, 08:06
  • 4
    @KeithThompson: Но затем необходимо сохранить счетчик и увеличить его. –  Paused until further notice. 04.06.2012, 08:27
  • 5
    Вот сценарий, который я записал для перепланирования at вакансии. Это не является подходящим для вопроса, но это мимоходом связано. –  Paused until further notice. 04.06.2012, 08:32
  • 6
    Вот сценарий, который я записал для перепланирования at вакансии. Это не является подходящим для вопроса, но это мимоходом связано. –  Paused until further notice. 04.06.2012, 08:32

Необходимо использовать at вместо cron, это позволит Вам выполнять задачу точно однажды. Это могло затем перенести себя.


Ну, я хотел бы предложить некоторое улучшение Вашего собственного решения - если Вы будете придерживаться его. Это, однако, все еще потребует для запущения скрипта каждую минуту через cron:

Вместо того, чтобы управлять любой установкой или отследить, когда сценарий работал в прошлый раз, Вы могли достигнуть той же цели с меткой времени UNIX:

День имеет 60*60*24 = 86400 секунды. Если Вы добавляете 3*60 = 480 от Ваших требований Вы имеете 86880 секунды - и это - точно интервал, который Вы хотите, чтобы Ваш сценарий выполнил. В сценарии можно теперь проверить, равняется ли текущий % времени UNIX (по модулю) это число секунд нулю и аварийному прекращению работы иначе.

Если у Вас должен быть явный первый показ, как 5-го июня 2012, 4:00, можно вычесть связанную метку времени (1338861600) с местного времени сначала, проверьте, что это не меньше, чем нуль, и возобновите различие...


Конечно, Вы могли также позволить сценарию изменить свой собственный crontab запись, но это является опасным и также довольно неловким.

2
27.01.2020, 20:51
  • 1
    Предпочтительно это работало бы на начальной загрузке/перезагрузке и сохранило бы корректную последовательность даже в случае случайной перезагрузки. Да сценарий, редактируя crontab звучит опасным... Можно ли объяснить больше о Inside the script you can now check whether the current UNIX time % (modulo) this number of seconds equals zero, and abort otherwise. –   04.06.2012, 08:00
  • 2
    Операция по модулю возвращает остаток от подразделения. Так, если напоминание является нулем, Вы знаете, что точная сумма секунд была передана. См. en.wikipedia.org/wiki/Remainder и en.wikipedia.org/wiki/Modulo_operation - но это - просто необычный материал, я рекомендовал бы at команда как Dennis сделала –   04.06.2012, 08:16
  • 3
    при проверке секунд, разве Вы не рискуете этим, если проверка сценария происходит один второй последний (возможно, потому что машина делает большую работу), это "думало" бы, что это не правильное время для выполнения? –  João Portela 04.06.2012, 13:21
  • 4
    Конечно. Но поскольку я сказал, это - просто необычный способ пойти, "потому что каждый может" - at вероятно, верный выбор здесь.. –  mjhennig 04.06.2012, 13:27
  • 5
    я думал, что должен предупредить в случае, если кто-то хочет использовать его так или иначе. С тех пор в том подходе выполнения сценария каждую минуту, 30-секундный интервал после того, как целевое время кажется разумным ( UnixTime % 86880 < 30 )'. –  João Portela 04.06.2012, 13:37

Можно изменить сценарий для проверки некоторого файла флага со временем для выполнения сначала. Если соответствия времени ко времени начала, то Ваш сценарий продолжается, иначе он заканчивается выходом 0. И можно запустить его в кроне даже каждую минуту (или однажды в 3 минуты, кажется, что это может быть достаточно для случая). Также Вам нужен Ваш сценарий для изменения времени следующего запуска в файле флага. Тот достаточно сейф и Вы не пропустите времени начала даже в случае случайной перезагрузки.

0
27.01.2020, 20:51

Теги

Похожие вопросы