Как проверить еженедельное задание?
У меня есть #!/bin/bash файл в cron.недельный справочник.
есть ли способ проверить, работает ли он? Не могу дождаться 1 неделю
Я на Debian 6 с root
11 ответов:
просто сделайте то, что делает cron, выполните следующее Как
root:run-parts -v /etc/cron.weekly... или следующий, если вы получаете" не каталог: -v " ошибка:
run-parts /etc/cron.weekly -vопции
-vпечатает имена сценариев перед их запуском.
немного выходит за рамки вашего вопроса... но вот что я делаю.
"как проверить задание cron?"вопрос тесно связан с "как я могу тестировать сценарии, которые выполняются в неинтерактивных контекстах, запущенных другими программами?"В cron триггер является некоторым условием времени, но многие другие объекты *nix запускают скрипты или фрагменты скриптов неинтерактивными способами, и часто условия, в которых запускаются эти скрипты, содержат что-то неожиданное и вызывают поломку до тех пор, пока ошибки разбираются.
общий подход к этой проблеме полезно.
один из моих любимых методов-использовать сценарий, который я написал под названием 'crontest'. Он запускает целевую команду внутри сеанса экрана GNU из cron, так что вы можете подключиться с помощью отдельного терминала, чтобы увидеть, что происходит, взаимодействовать со скриптом, даже использовать отладчик.
чтобы настроить это, вы должны использовать "все звезды" в своей записи crontab и указать crontest как первая команда в командной строке, например:
* * * * * crontest /command/to/be/tested --param1 --param2Так что теперь cron будет запускать вашу команду каждую минуту, но crontest будет гарантировать, что только один экземпляр работает одновременно. Если команда требует времени для запуска, вы можете сделать "экран-x", чтобы прикрепить и посмотреть, как он работает. Если команда является сценарием, вы можете поместить команду "read" вверху, чтобы остановить ее и дождаться завершения вложения экрана (нажмите enter после присоединения)
Если ваша команда является скриптом bash, вы можете сделать это вместо:
* * * * * crontest --bashdb /command/to/be/tested --param1 --param2Теперь, если вы присоединитесь с помощью "screen-x", вы столкнетесь с интерактивным сеансом bashdb, и вы можете пройти через код, изучить переменные и т. д.
#!/bin/bash # crontest # See https://github.com/Stabledog/crontest for canonical source. # Test wrapper for cron tasks. The suggested use is: # # 1. When adding your cron job, use all 5 stars to make it run every minute # 2. Wrap the command in crontest # # # Example: # # $ crontab -e # * * * * * /usr/local/bin/crontest $HOME/bin/my-new-script --myparams # # Now, cron will run your job every minute, but crontest will only allow one # instance to run at a time. # # crontest always wraps the command in "screen -d -m" if possible, so you can # use "screen -x" to attach and interact with the job. # # If --bashdb is used, the command line will be passed to bashdb. Thus you # can attach with "screen -x" and debug the remaining command in context. # # NOTES: # - crontest can be used in other contexts, it doesn't have to be a cron job. # Any place where commands are invoked without an interactive terminal and # may need to be debugged. # # - crontest writes its own stuff to /tmp/crontest.log # # - If GNU screen isn't available, neither is --bashdb # crontestLog=/tmp/crontest.log lockfile=$(if [[ -d /var/lock ]]; then echo /var/lock/crontest.lock; else echo /tmp/crontest.lock; fi ) useBashdb=false useScreen=$( if which screen &>/dev/null; then echo true; else echo false; fi ) innerArgs="$@" screenBin=$(which screen 2>/dev/null) function errExit { echo "[-err-] $@" | tee -a $crontestLog >&2 } function log { echo "[-stat-] $@" >> $crontestLog } function parseArgs { while [[ ! -z ]]; do case in --bashdb) if ! $useScreen; then errExit "--bashdb invalid in crontest because GNU screen not installed" fi if ! which bashdb &>/dev/null; then errExit "--bashdb invalid in crontest: no bashdb on the PATH" fi useBashdb=true ;; --) shift innerArgs="$@" return 0 ;; *) innerArgs="$@" return 0 ;; esac shift done } if [[ -z $sourceMe ]]; then # Lock the lockfile (no, we do not wish to follow the standard # advice of wrapping this in a subshell!) exec 9>$lockfile flock -n 9 || exit 1 # Zap any old log data: [[ -f $crontestLog ]] && rm -f $crontestLog parseArgs "$@" log "crontest starting at $(date)" log "Raw command line: $@" log "Inner args: $@" log "screenBin: $screenBin" log "useBashdb: $( if $useBashdb; then echo YES; else echo no; fi )" log "useScreen: $( if $useScreen; then echo YES; else echo no; fi )" # Were building a command line. cmdline="" # If screen is available, put the task inside a pseudo-terminal # owned by screen. That allows the developer to do a "screen -x" to # interact with the running command: if $useScreen; then cmdline="$screenBin -D -m " fi # If bashdb is installed and --bashdb is specified on the command line, # pass the command to bashdb. This allows the developer to do a "screen -x" to # interactively debug a bash shell script: if $useBashdb; then cmdline="$cmdline $(which bashdb) " fi # Finally, append the target command and params: cmdline="$cmdline $innerArgs" log "cmdline: $cmdline" # And run the whole schlock: $cmdline res=$? log "Command result: $res" echo "[-result-] $(if [[ $res -eq 0 ]]; then echo ok; else echo fail; fi)" >> $crontestLog # Release the lock: 9<&- fi
после возни с некоторыми вещами в cron, которые не были мгновенно совместимы, я обнаружил, что следующий подход был хорош для отладки:
crontab -e * * * * * /path/to/prog var1 var2 &>>/tmp/cron_debug_log.logэто будет запускать задачу один раз в минуту, и вы можете просто посмотреть в чтобы выяснить, что происходит.
это не совсем "пожарная работа", которую вы, возможно, ищете, но это очень помогло мне при отладке скрипта, который сначала не работал в cron.
Я бы использовал файл блокировки, а затем установил задание cron для запуска каждую минуту. (используйте crontab-e и * * * * * /path/to/job) таким образом, вы можете просто продолжать редактировать файлы, и каждую минуту они будут протестированы. Кроме того, вы можете остановить cronjob, просто коснувшись файла блокировки.
#!/bin/sh if [ -e /tmp/cronlock ] then echo "cronjob locked" exit 1 fi touch /tmp/cronlock <...do your regular cron here ....> rm -f /tmp/cronlock
насчет положить его в
cron.hourly, ожидая следующего запуска почасовых заданий cron, а затем удаляя его? Это запустило бы его один раз в течение часа, и в среде cron. Вы также можете запустить./your_script, но это не будет иметь ту же среду, что и под cron.
кроме того, вы также можете использовать:
http://pypi.python.org/pypi/cronwrap
чтобы завернуть Ваш cron, чтобы отправить вам электронное письмо после успеха или неудачи.
ни один из этих ответов не соответствует моей конкретной ситуации, которая заключалась в том, что я хотел запустить одно конкретное задание cron, только один раз, и запустить его немедленно.
Я нахожусь на сервере Ubuntu, и я использую cPanel для настройки моих заданий cron.
Я просто записал свои текущие настройки, а затем отредактировал их, чтобы быть через одну минуту. Когда я исправил еще одну ошибку,я просто отредактировал ее снова до одной минуты. И когда я все сделал, я просто сбросил настройки обратно, как они были до.
пример: сейчас 4: 34 вечера, поэтому я поставил 35 16 * * *, чтобы он работал в 16: 35.
Это сработало как заклинание, и самое большее, что мне когда-либо приходилось ждать, было чуть меньше одной минуты.
Я думал, что это лучший вариант, чем некоторые другие ответы, потому что я не хотел запускать все мои еженедельные кроны, и я не хотел, чтобы работа выполнялась каждую минуту. Мне требуется несколько минут, чтобы исправить все проблемы, прежде чем я буду готов проверить его снова. Обнадеживающе это кому-то помогает.
Я обычно тестирую, запустив задание, которое я создал следующим образом:
для этого проще использовать два терминала.
выполнить задание:
#./jobname.shна:
#/var/log and runвыполнить следующее:
#tailf /var/log/cronЭто позволяет мне видеть обновление журналов cron в режиме реального времени. Вы также можете просмотреть журнал после его запуска, я предпочитаю смотреть в режиме реального времени.
вот пример простого задания. Запуск yum обновление...
#!/bin/bash YUM=/usr/bin/yum $YUM -y -R 120 -d 0 -e 0 update yum $YUM -y -R 10 -e 0 -d 0 updateвот:
первая команда обновит сам yum, а затем применит системные обновления.
- R 120: задает максимальное время ожидания yum перед выполнением команды
- e 0: устанавливает уровень ошибки в 0 (диапазон 0 - 10). 0 означает печать только критических ошибок, о которых вам необходимо сообщить.
- d 0: устанавливает уровень отладки в 0-поворачивает вверх или вниз количество вещей, которые печатаются. (диапазон: 0 - 10).
-y : предположим, что да; предположим, что ответ на любой вопрос, который будет задан, да
после того, как я построил задание cron, я запустил команду ниже, чтобы сделать мое задание исполняемым.
#chmod +x /etc/cron.daily/jobname.shнадеюсь, это поможет, Дорлак
решение я использую выглядит следующим образом:
- изменить crontab(используйте команду: crontab-e) для запуска задания как можно чаще по мере необходимости (каждые 1 минуту или 5 минут)
- измените сценарий оболочки, который должен быть выполнен с помощью cron для печати вывода в какой-либо файл (например: echo "работает нормально" >>
выход.txt)- Проверьте выход.txt-файл с помощью команды: вывод tail-F.txt, который будет печатать последние дополнения в этот файл, и таким образом вы можете отслеживать выполнение скрипта
Я использую Webmin потому что его жемчужина производительности для тех, кто считает администрирование командной строки немного сложной и непроницаемой.
там есть "сохранить и сейчас кнопку Run" в меню "Система > Планировщик заданий cron > редактировать cron работу" веб-интерфейс.
он отображает вывод команды и это именно то, что мне нужно.