Почему скрипты crontab не работают?

Часто скрипты crontab не выполняются по расписанию или как ожидалось. Для этого существует множество причин:

неправильные разрешения для обозначения нот кнтабата.

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

Пожалуйста, укажите одну причину для каждого ответа - подробности о том, почему она не выполнена - и исправить это по одной причине.

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

1
задан 8 May 2017 в 21:15

29 ответов

My top gotcha: Если вы забыли добавить новую строку в конце файла crontab. Другими словами, файл crontab должен заканчиваться пустой строкой.

Ниже приведен соответствующий раздел на страницах руководства для этой проблемы (man crontab, затем пропустите до конца):

   Although cron requires that each entry in a crontab end  in  a  newline
   character,  neither the crontab command nor the cron daemon will detect
   this error. Instead, the crontab will appear to load normally. However,
   the  command  will  never  run.  The best choice is to ensure that your
   crontab has a blank line at the end.

   4th Berkeley Distribution      29 December 1993               CRONTAB(1)
276
ответ дан 25 May 2018 в 23:19
  • 1
    это такой шоу-шоппер, почему он не исправлен за столь многие годы существования cron? – Capi Etheriel 27 January 2011 в 07:20
  • 2
    Кажется, что исправлено в Vixie cron: man crontab на Ubuntu 10.10 говорит, что «cron требует, чтобы каждая запись в crontab заканчивалась символом новой строки. Если последняя запись в crontab отсутствует в новой строке, cron рассмотрит crontab (по крайней мере частично) и откажется его установить. & Quot; (И дата в конце - 19 апреля 2010 года). – Marius Gedminas 2 February 2011 в 02:58
  • 3
    @barraponto Это на самом деле ошибка в новых текстовых редакторах. «Новая линия» символ должен быть символом окончания окончания строки , поэтому конечная строка в текстовом файле должна заканчиваться символом новой строки, который не отображается в редакторе. Vi и vim правильно используют персонажа, а cron был создан до того, как новые редакторы начали свое странное поведение ... Следовательно, воспроизведение его сохраняет и включает пустую строку. – Izkata 18 January 2012 в 21:20
  • 4
    Если вы отредактируете crontab с помощью crontab -e, он проверит синтаксис файла, прежде чем разрешить сохранение, включая проверку новой строки. – Tom Harrison Jr 26 September 2014 в 23:26
  • 5
    @ Chan-HoSuh, согласно man-странице «cron» требует, чтобы каждая запись в crontab заканчивалась символом новой строки. Если последняя запись в crontab отсутствует в новой строке, cron рассмотрит crontab (по крайней мере частично) и откажется его установить. & Quot; Это поведение будет вызываться при редактировании, затем сохранение crontab с использованием опции -e и не зависит от редактора. – Tom Harrison Jr 18 November 2014 в 20:40

Демон Cron не работает.

Тип:

pgrep cron 

Если вы не видите числа, cron не работает. sudo /etc/init.d/cron start можно использовать для запуска cron.

EDIT: вместо вызова сценариев инициализации через /etc/init.d используйте служебную утилиту, например

sudo service cron start
117
ответ дан 25 May 2018 в 23:19
  • 1
    Спасибо, что показал мне pgrep. Я продолжал делать ps -ef | grep foo – ripper234 17 March 2011 в 21:01
  • 2
    Вы также можете использовать pidof cron, который опускает результаты для других приложений, которые также имеют слово «cron», например, crontab. – Pithikos 11 March 2014 в 22:19
  • 3
    Странно, все это не дает мне ничего, чтобы показать, что cron работает, но если я запустил sudo service cron start, я получаю start: Job is already running: cron – Colleen 6 April 2015 в 20:04
  • 4
    service crond start, если его centos / RHEL – Srihari Karanth 18 January 2017 в 14:02

Имена файлов сценариев в файлах cron.d/, cron.daily/, cron.hourly/ и т. д. не должны содержать точку (.), в противном случае пробег будет пропущен.

(8):

   If neither the --lsbsysinit option nor the --regex option is given then
   the names must consist entirely of upper and lower case  letters,  dig‐
   its, underscores, and hyphens.

   If  the  --lsbsysinit  option  is given, then the names must not end in
   .dpkg-old  or .dpkg-dist or .dpkg-new or .dpkg-tmp, and must belong  to
   one  or more of the following namespaces: the LANANA-assigned namespace
   (^[a-z0-9]+$);   the   LSB   hierarchical   and   reserved   namespaces
   (^_?([a-z0-9_.]+-)+[a-z0-9]+$);  and  the  Debian cron script namespace
   (^[a-zA-Z0-9_-]+$).

Итак, если у вас есть cron-скрипт backup.sh, analyze-logs.pl в каталоге cron.daily/, лучше удалить имена расширений.

79
ответ дан 25 May 2018 в 23:19
  • 1
    Это особенность, а не ошибка - она ​​хранит такие вещи, как myscript.backup или myscript.original или myscript.rpm-new, которые запускаются рядом с myscript. – pbr 9 April 2012 в 03:45
  • 2
    @pbr: имеет смысл. По крайней мере, это было бы полезно для отладки, если run-parts --test (или другая мнимая опция, такая как --debug, выводит файлы, которые она пропускает, включая причину. – Rabarberski 30 May 2013 в 13:46
  • 3
    Если это особенность, это не очень приятно :( Многие люди используют точку в имени файла (наиболее распространенным является backup.sh). Если вы хотите, чтобы скрипт прекратил выполнение, самым логичным методом будет удалите его из каталога cron.d. – MatuDuke 16 May 2014 в 18:59
  • 4
    Это такая плохая функция, что это ошибка. Обычно принято требовать конкретного окончания (например, «список» или «.cron» или что-то еще), если люди хотят удостовериться, что вещи только запускаются, когда они предназначены. Произвольный выбор точки в качестве вероятного разделителя для ".bak" или ".temp" или что-то еще, совершенно непредсказуемо, за исключением того, что он будет предсказуемо путать людей. Законные окончания, такие как «.sh» и «.pl» широко используются десятилетиями. Многие люди используют «_bak». или "_temp" или "-бак" вместо точки, однако. Это ужасный выбор дизайна; это лучшая проектная ошибка. – Teekin 10 May 2017 в 23:42

Во многих средах cron выполняет команды с использованием sh, в то время как многие полагают, что он будет использовать bash.

Предложения по проверке или исправлению этого для команды сбоя:

Попробуйте запустить команду в sh, чтобы увидеть, работает ли она. Завершите команду в подошве bash, чтобы убедиться, что она запущена в bash: bash -c "mybashcommand" Скажите cron, чтобы запустить все команды в bash, установив оболочку в верхней части вашего crontab : SHELL=/bin/bash Если команда является скриптом, убедитесь, что скрипт содержит shebang: #!/bin/bash
55
ответ дан 25 May 2018 в 23:19
  • 1
    Предложение bash очень полезно, исправлена ​​проблема с моим cron. – Maxim Galushka 19 February 2016 в 02:38
  • 2
    Это просто вызвало у меня 1 час поиска / устранения неполадок. Еще более озадачивая, если вы не знаете о проблеме, скрипт будет работать вручную просто отлично, если вы типичная оболочка bash, но не с cron. Благодаря! – Hendy 22 November 2016 в 23:42
  • 3
    Давно я столкнулся с чем-то связанным: команда source находится в bash, но не sh. В cron / sh используйте период: . envfile, а не source envfile. – kungphu 22 December 2017 в 06:24

У меня были некоторые проблемы с часовыми поясами. Cron работал со свежим временем установки. Решением было перезапустить cron:

sudo service cron restart
34
ответ дан 25 May 2018 в 23:19
  • 1
    Да, после изменения часового пояса в системе необходимо либо перезапустить все службы, которые интересуются временем, либо перезагрузкой. Я предпочитаю перезагрузку, чтобы убедиться, что все поймал. – pbr 9 April 2012 в 03:48
  • 2
    О Боже, убил часов на этом. Попробовал перезапуск службы после того, как * * * * * touch /tmp/cronworks ничего не сделал, но в cronlog есть RELOAD. – НЛО 1 October 2014 в 08:57

Если ваша команда crontab имеет в ней символ %, cron пытается ее интерпретировать. Поэтому, если вы использовали какую-либо команду с % в ней (например, спецификацию формата для команды date), вам нужно будет ее избежать.

Это и другие хорошие ошибки здесь: http: // www.pantz.org/software/cron/croninfo.html

29
ответ дан 25 May 2018 в 23:19

Абсолютный путь должен использоваться для скриптов:

Например, вместо grep следует использовать /bin/grep:

# m h  dom mon dow   command
0 0 *  *  *  /bin/grep ERROR /home/adam/run.log &> /tmp/errors

Вместо:

# m h  dom mon dow   command
0 0 *  *  *  grep ERROR /home/adam/run.log &> /tmp/errors

Это особенно сложно, потому что одна и та же команда будет работать при выполнении из оболочки. Причина в том, что cron не имеет той же переменной среды PATH, что и пользователь.

27
ответ дан 25 May 2018 в 23:19
  • 1
    см. ответ geirha, вы можете (должны) определить cron's PATH – Capi Etheriel 27 January 2011 в 07:22
  • 2
    Bzzt. вам НЕ нужно определять PATH - использование абсолютных путей - лучшая практика здесь. ", поскольку исполняемый файл может быть в другом месте на каком-либо другом компьютере" не trump " Я хочу, чтобы он выполнял именно эту программу, а не какой-то другой, кто вставил путь перед моей исходной программой " – pbr 9 April 2012 в 03:55
  • 3
    да, это было для меня, вне cron я мог запускать команду напрямую, внутри cron ему нужен полный путь /usr/bin/whatever – Anentropic 14 August 2016 в 13:56

Возможно также, что пароль пользователя истек. Даже пароль root может истек. Вы можете tail -f /var/log/cron.log, и вы увидите cron fail с истекшим паролем. Вы можете установить пароль так, чтобы он не заканчивался, выполнив это: passwd -x -1 <username>

В некоторых системах (Debian, Ubuntu) регистрация cron по умолчанию не включена. В файле /etc/rsyslog.conf или /etc/rsyslog.d/50-default.conf строка:

# cron.*                          /var/log/cron.log

должна быть отредактирована (sudo nano /etc/rsyslog.conf) раскомментирована на:

cron.*                          /var/log/cron.log

После этого вам необходимо перезапустить rsyslog с помощью

/etc/init.d/rsyslog restart

или

service rsyslog restart 

Источник: Включить ведение журнала crontab в Debian Linux

In для некоторых систем (Ubuntu) отдельный файл регистрации для cron по умолчанию не включен, но связанные с cron журналы отображаются в файле syslog. Для просмотра сообщений, связанных с cron, можно использовать

cat /var/log/syslog | grep cron

.

23
ответ дан 25 May 2018 в 23:19
  • 1
    У меня есть Debian (wheezy), но нет /etc/init.d/rsyslog, только inetutils-syslogd и sysklogd. Должен ли я что-то установить или просто перезапустить один из двух? – hgoebl 21 October 2016 в 14:41

Cron вызывает скрипт, который не является исполняемым.

При запуске chmod +x /path/to/scrip скрипт становится исполняемым и должен решить эту проблему.

20
ответ дан 25 May 2018 в 23:19
  • 1
    Это не уникально для cron и легко прослеживается, просто пытаясь выполнить /path/to/script из командной строки. – Adam Matan 27 January 2011 в 10:33
  • 2
    Если вы используете сценарии с . scriptname или sh scriptname или bash scriptname, это становится проблемой cron. – Eliah Kagan 25 November 2011 в 05:09

Если ваш cronjob вызывает GUI-приложения, вам нужно сказать им, что они должны использовать DISPLAY.

Пример: запуск Firefox с помощью cron.

Ваш скрипт должен содержать export DISPLAY=:0 где-то.

16
ответ дан 25 May 2018 в 23:19

Боюсь, что проблемы с разрешениями довольно распространены.

Обратите внимание, что обычным обходным решением является выполнение всего с помощью crontab root, который иногда является «действительно плохой идеей». Установка правильных разрешений, безусловно, в значительной степени игнорируется.

14
ответ дан 25 May 2018 в 23:19
  • 1
    Обратите внимание: если у вас есть линия crontab, которая настроена на вывод канала в файл, который еще не существует, а каталог для файла - тот, к которому пользователь cron не имеет доступа, тогда строка не будет выполняться. – Evan Donovan 10 September 2015 в 19:51

Небезопасное разрешение таблицы cron

Таблица cron отклоняется, если ее разрешение небезопасно

sudo service cron restart
grep -i cron /var/log/syslog|tail -2
2013-02-05T03:47:49.283841+01:00 ubuntu cron[49906]: (user) INSECURE MODE (mode 0600 expected) (crontabs/user)

Проблема решена с помощью

# correct permission
sudo chmod 600 /var/spool/cron/crontabs/user
# signal crond to reload the file
sudo touch /var/spool/cron/crontabs
13
ответ дан 25 May 2018 в 23:19
  • 1
    Сначала я понял это сам, а потом нашел ваш ответ! Еще большое спасибо! В моем случае я вернул / восстановил некоторые crontabs в / var / spool / cron / crontabs через SVN, который изменил его разрешения! – alfonx 9 June 2013 в 01:40

Сценарий чувствителен к местоположению. Это связано с всегда использованием абсолютных путей в скрипте, но не совсем то же самое. Перед запуском вашего задания cron может понадобиться cd в конкретный каталог. задача rake в приложении Rails, возможно, должна быть в корне приложения для Rake для поиска правильной задачи, не говоря уже о соответствующей конфигурации базы данных и т. д.

Итак, запись crontab из

23 3 * * * /usr/bin/rake db:session_purge RAILS_ENV=production

будет лучше, чем

23 3 * * * cd /var/www/production/current && /usr/bin/rake db:session_purge RAILS_ENV=production

Или, чтобы сохранить вход crontab проще и менее хрупким:

23 3 * * * /home/<user>/scripts/session-purge.sh

со следующим кодом в /home/<user>/scripts/session-purge.sh:

cd /var/www/production/current /usr/bin/rake db:session_purge RAILS_ENV=production
10
ответ дан 25 May 2018 в 23:19
  • 1
    Если скрипт, вызываемый из cron, написан на интерпретируемом языке, таком как PHP, вам может потребоваться установить рабочий каталог в самом скрипте. Например, в PHP: chdir(dirname(__FILE__)); – Evan Donovan 10 September 2015 в 19:14
  • 2
    Просто попался с этим: сценарий был в корне моего домашнего каталога, но затем я переместил его (и обновил crontab) и не мог понять, почему он не работает. Оказывается, скрипт использовал относительный путь, предполагая, что он относился к местоположению скрипта, но он был по существу относительно корня моего домашнего каталога, потому что это был рабочий каталог, который использовал cron, поэтому сценарий работал, когда он был в корне моей домашней директории (потому что ожидаемый рабочий каталог сценария и фактическая работа только совпадали ). – Micheal Johnson 4 February 2016 в 22:36

Спецификации Crontab, которые работали в прошлом, могут сломаться при перемещении из одного файла crontab в другой. Иногда причина в том, что вы переместили спецификацию из файла crontab системы в файл crontab пользователя или наоборот.

Формат спецификации заданий cron отличается между файлами crontab пользователей (/ var / spool / cron / username или / var / spool / cron / crontabs / username) и системы crontabs (/etc/crontab и файлы в /etc/cron.d).

В системе crontabs есть дополнительное поле «пользователь», прямо перед командой для запуска.

Это приведет к ошибкам, указывающим на такие вещи, как , которые работали в прошлом , когда вы перемещаете команду из /etc/crontab или файла в [ f5] в файл crontab пользователя.

Наоборот, cron будет выдавать ошибки, такие как /usr/bin/restartxyz is not a valid username или подобное, когда происходит обратное.

10
ответ дан 25 May 2018 в 23:19

cron script вызывает команду с опцией -verbose

У меня был сценарий cron сбой, потому что я был в автопилоте, набирая скрипт, и я включил параметр -verbose: [!d1 ]

#!/bin/bash
some commands
tar cvfz /my/archive/file.tar.gz /my/shared/directory
come more commands

Скрипт отлично работает при выполнении из оболочки, но не работает при запуске crontab, потому что подробный вывод идет на stdout при запуске из оболочки, но нигде не запускается crontab. Легко исправить удаление 'v':

#!/bin/bash
some commands
tar cfz /my/archive/file.tar.gz /my/shared/directory
some more commands
9
ответ дан 25 May 2018 в 23:19
  • 1
    Почему это вызывает провал? Проблемы с буфером? – Adam Matan 31 May 2012 в 11:38
  • 2
    Любые выходы или ошибки, вызванные заданиями cron, отправляются на ваш почтовый ящик. Поэтому мы никогда не должны забывать об этих ошибках / выходе. Мы можем перенаправить их на любой файл или / dev / null – Nischay 27 September 2013 в 16:32

Наиболее частая причина, по которой я видел cron fail в неверно заявленном графике. Для определения задания, запланированного на 11:15 вечера, требуется 30 23 * * * вместо * * 11 15 * или 11 15 * * *. День недели для работы после полуночи также путает M-F 2-6 после полуночи, а не 1-5. Конкретные даты обычно являются проблемой, поскольку мы редко используем их * * 3 1 * не является 3 марта.

Если ваша работа с различными платформами с использованием неподдерживаемых опций, таких как 2/3 во временных спецификациях, также может привести к сбоям. Это очень полезный вариант, но не универсальный. Я также столкнулся с проблемами, такими как 1-5 или 1,3,5.

Использование неквалифицированных путей также вызвало проблемы. Путь по умолчанию обычно /bin:/usr/bin, поэтому будут запускаться только стандартные команды. Обычно эти каталоги не имеют требуемой команды. Это также влияет на скрипты с использованием нестандартных команд. Другие переменные среды также могут отсутствовать.

Повреждение существующего crontab полностью вызвало у меня проблемы. Теперь я загружу из копии файла. Это может быть восстановлено из существующего crontab, используя crontab -l, если оно будет сбито. Я сохраняю копию crontab в ~ / bin. Он прокомментирован повсюду и заканчивается линией # EOF. Это перезагружается ежедневно с помощью записи crontab, например:

#!/usr/bin/crontab # Reload this crontab # 54 12 * * * ${HOME}/bin/crontab

. Команда reload выше полагается на исполняемый crontab с пропуском crontab. Для некоторых систем требуется команда crontab в команде и указание файла. Если каталог является общим для сети, я часто использую crontab.$(hostname) как имя файла. Это будет в конечном итоге исправлять случаи, когда неправильный crontab загружается на неправильный сервер.

Использование файла обеспечивает резервную копию того, что должен быть crontab, и позволяет временные изменения (единственный раз, когда я использую crontab -e), для автоматического резервирования. Доступны заголовки, которые помогают с правильной настройкой параметров планирования. Я добавил их, когда неопытные пользователи будут редактировать crontab.

Редко, я столкнулся с командами, требующими ввода пользователем. Они не работают в режиме crontab, хотя некоторые из них будут работать с перенаправлением ввода.

7
ответ дан 25 May 2018 в 23:19
  • 1
    Это касается трех отдельных проблем. Могут ли они быть разделены на отдельные ответы? – Eliah Kagan 25 November 2011 в 05:07
  • 2
    Можете ли вы объяснить, как 30 23 * * * переводится в 11:15? – JYelton 11 January 2014 в 01:23

Если вы обращаетесь к учетной записи с помощью SSH-ключей, вы можете войти в учетную запись, но не заметить, что пароль в учетной записи заблокирован (например, из-за истечения или недопустимых попыток пароля)

Если система использует PAM, и учетная запись заблокирована, это может остановить запуск cronjob. (Я тестировал это на Solaris, но не на Ubuntu)

Вы можете найти такие сообщения в / var / adm / messages:

Oct 24 07:51:00 mybox cron[29024]: [ID 731128 auth.notice] pam_unix_account: cron attempting to validate locked account myuser from local host Oct 24 07:52:00 mybox cron[29063]: [ID 731128 auth.notice] pam_unix_account: cron attempting to validate locked account myuser from local host Oct 24 07:53:00 mybox cron[29098]: [ID 731128 auth.notice] pam_unix_account: cron attempting to validate locked account myuser from local host Oct 24 07:54:00 mybox cron[29527]: [ID 731128 auth.notice] pam_unix_account: cron attempting to validate locked account myuser from local host

Все, что вам нужно do запускается:

# passwd -u <USERNAME>

как root, чтобы разблокировать учетную запись, и crontab должен снова работать.

6
ответ дан 25 May 2018 в 23:19

В моем случае у cron и crontab были разные владельцы.

НЕ работает. У меня было это:

User@Uva ~ $ ps -ef | grep cron | grep -v grep
User    2940    7284 pty1     19:58:41 /usr/bin/crontab
SYSTEM   11292     636 ?        22:14:15 /usr/sbin/cro 

В основном мне приходилось запускать cron-config и правильно отвечать на вопросы. Есть момент, когда мне нужно было ввести мой пароль пользователя Win7 для моей учетной записи «Пользователь». Из чтения, которое я сделал, похоже, что это потенциальная проблема безопасности, но я единственный администратор в одной домашней сети, поэтому я решил, что все в порядке.

Вот последовательность команд, которая заставила меня двигаться: [ ! d3]

User@Uva ~ $ cron-config
The cron daemon can run as a service or as a job. The latter is not recommended.
Cron is already installed as a service under account LocalSystem.
Do you want to remove or reinstall it? (yes/no) yes
OK. The cron service was removed.

Do you want to install the cron daemon as a service? (yes/no) yes
Enter the value of CYGWIN for the daemon: [ ] ntsec

You must decide under what account the cron daemon will run.
If you are the only user on this machine, the daemon can run as yourself.
   This gives access to all network drives but only allows you as user.
To run multiple users, cron must change user context without knowing
  the passwords. There are three methods to do that, as explained in
  http://cygwin.com/cygwin-ug-net/ntsec.html#ntsec-nopasswd1
If all the cron users have executed "passwd -R" (see man passwd),
  which provides access to network drives, or if you are using the
  cyglsa package, then cron should run under the local system account.
Otherwise you need to have or to create a privileged account.
  This script will help you do so.
Do you want the cron daemon to run as yourself? (yes/no) no

Were the passwords of all cron users saved with "passwd -R", or
are you using the cyglsa package ? (yes/no) no

Finding or creating a privileged user.
The following accounts were found: 'cyg_server' .
This script plans to use account cyg_server.
Do you want to use another privileged account name? (yes/no) yes
Enter the other name: User

Reenter: User


Account User already exists. Checking its privileges.
INFO: User is a valid privileged account.
INFO: The cygwin user name for account User is User.

Please enter the password for user 'User':
Reenter:
Running cron_diagnose ...
... no problem found.

Do you want to start the cron daemon as a service now? (yes/no) yes
OK. The cron daemon is now running.

In case of problem, examine the log file for cron,
/var/log/cron.log, and the Windows event log (using /usr/bin/cronevents)
for information about the problem cron is having.

Examine also any cron.log file in the HOME directory
(or the file specified in MAILTO) and cron related files in /tmp.

If you cannot fix the problem, then report it to cygwin@cygwin.com.
Please run the script /usr/bin/cronbug and ATTACH its output
(the file cronbug.txt) to your e-mail.

WARNING: PATH may be set differently under cron than in interactive shells.
         Names such as "find" and "date" may refer to Windows programs.


User@Uva ~ $ ps -ef | grep cron | grep -v grep
    User    2944   11780 ?        03:31:10 /usr/sbin/cron
    User    2940    7284 pty1     19:58:41 /usr/bin/crontab

User@Uva ~ $
3
ответ дан 25 May 2018 в 23:19
  • 1
    Хотя это хорошо документировано, это похоже на специфическую для Cygwin точку; действительно ли это в askubuntu? – sxc731 7 February 2016 в 15:14

Я писал сценарий установки, который создает другой скрипт для очистки старых данных транзакций из базы данных. В рамках задачи он должен был настроить ежедневное задание cron для запуска в произвольное время, когда загрузка базы данных была низкой.

Я создал файл mycronjob с расписанием cron, username & amp; и скопировал его в каталог /etc/cron.d. Мои два gotchas:

mycronjob файл должен был принадлежать root для запуска, я должен был установить права доступа к файлу на 644 - 664, который не будет работать.

Проблема разрешения появится в /var/log/syslog как нечто похожее на:

Apr 24 18:30:01 ip-11-22-33-44 cron[40980]: (*system*) INSECURE MODE (group/other writable) (/etc/crontab)
Apr 24 18:30:01 ip-11-22-33-44 cron[40980]: (*system*) INSECURE MODE (group/other writable) (/etc/cron.d/user)

Первая строка относится к файлу /etc/crontab, а затем к файлу, который я помещал под [ f8].

3
ответ дан 25 May 2018 в 23:19

Если у вас есть такая команда:

* * * * * /path/to/script >> /tmp/output

, и она не работает, и вы не можете увидеть какой-либо вывод, это может не означать, что cron не работает. Сценарий может быть сломан, а выход идет в stderr, который не передается в / tmp / output. Проверьте, что это не так, также запустив этот вывод:

* * * * * /path/to/script >> /tmp/output 2>&1

, чтобы узнать, помогает ли эта проблема.

3
ответ дан 25 May 2018 в 23:19

Линия, написанная так, как не понимает crontab. Он должен быть правильно написан. Вот CrontabHowTo.

2
ответ дан 25 May 2018 в 23:19
  • 1
    Как это можно отладить? – Adam Matan 27 January 2011 в 10:34
  • 2
    Обзор журнала ошибок cron является наиболее распространенным способом. IIRC «crontab -e» выполняет синтаксический анализ после того, как вы также отредактировали файл, но это может быть не универсальным. – pbr 9 April 2012 в 03:47

Демон Cron может работать, но фактически не работает. Попробуйте перезапустить cron:

sudo /etc/init.d/cron restart
2
ответ дан 25 May 2018 в 23:19
  • 1
    Я НИКОГДА не видел этот случай в производстве. Не означает, что этого не произошло - просто я не видел его за 30 лет, когда я использовал UNIX и Linux. Крон безумно прочен. – pbr 9 April 2012 в 03:42
  • 2
    Я не уверен, но я думаю, что это действительно произошло со мной. Я попробовал pidof cron и ничего не получил. Пробовал использовать утилиту service, и он сказал, что cron уже работает. Просто запустил эту команду и снова запустил pidof, и я получил результат. – Colleen 6 April 2015 в 20:13

Запись в cron через «crontab -e» с аргументом имени пользователя в строке. Я видел примеры пользователей (или системных администраторов), которые пишут свои сценарии оболочки и не понимают, почему они не автоматизируют. Аргумент «user» существует в файле / etc / crontab, но не в файлах, определенных пользователем. поэтому, например, ваш личный файл будет выглядеть примерно так:

# m h dom mon dow command

* * */2  *   *  /some/shell/script

, тогда как / etc / crontab будет:

# m h dom mon dow user   command

* * */2  *   *  jdoe   /some/shell/script

Итак, зачем вы делаете последнее? Ну, в зависимости от того, как вы хотите установить свои разрешения, это может стать очень запутанным. Я написал сценарии для автоматизации задач для пользователей, которые не понимают тонкости, или не хотят беспокоиться о тяжелой работе. Установив разрешения для --x------, я могу сделать исполняемый файл сценария без возможности чтения (и, возможно, случайно) его. Тем не менее, я мог бы запустить эту команду с несколькими другими из одного файла (что упростит ее работу), но убедитесь, что для вывода файла назначен правильный владелец. Выполнение этого (по крайней мере, в Ubuntu 10.10) прерывает как невозможность прочитать файл, так и выполнить, плюс вышеупомянутую проблему с положением периодов в / etc / crontab (что, как ни странно, не вызывает ошибки при прохождении [ f4]).

В качестве примера я видел экземпляры sudo crontab -e, используемые для запуска скрипта с правами root, с соответствующим chown username file_output в сценарии оболочки. Sloppy, но он работает. IMHO, более изящным вариантом является поместить его в /etc/crontab с именем пользователя и правильными разрешениями, поэтому file_output отправится в нужное место и владелец.

2
ответ дан 25 May 2018 в 23:19
  • 1
    «Выполнение этого (по крайней мере, в Ubuntu 10.10) прерывает как невозможность прочитать файл, так и выполнить .....» Я должен уточнить: / etc / crontab (по умолчанию) требует прав на чтение и выполнение, тогда как вы МОЖЕТЕ запускать "sudo crontab -e" для создания cronjob, который переопределяет как необходимость "w" разрешение и проблема с расширениями типа «.sh». У меня не было времени разделить код cron и проверить, почему это работает, просто деталь, которую я заметил. – Mange 13 June 2012 в 00:54

Создав то, что Аарон Пирт упомянул в режиме подробностей, иногда сценарии, не в подробном режиме, будут инициализированы, но не закончатся, если поведение по умолчанию включенной команды заключается в выводе строки или более на экран после запуска proc. Например, я написал сценарий резервного копирования для нашей интрасети, который использовал curl, утилиту, которая загружает или загружает файлы на удаленные серверы, и весьма удобна, если вы можете обращаться к указанным удаленным файлам через HTTP. Использование «curl http://something.com/somefile.xls» вызывало сценарий, который я написал, чтобы висеть и никогда не заканчиваться, потому что он выплескивает новую строку, за которой следует строка прогресса. Я должен был использовать молчащий флаг (-s), чтобы сообщить ему не выводить какую-либо информацию и писать в моем собственном коде для обработки, если файл не удалось загрузить.

2
ответ дан 25 May 2018 в 23:19
  • 1
    Для программ, которые не имеют режима молчания, вы можете перенаправить свой вывод на /dev/null. Например: some-command > /dev/null Это приведет к перенаправлению только стандартного вывода, а не выводит ошибку (обычно это то, что вы хотите, поскольку вы хотите получать информацию об ошибках). Чтобы перенаправить вывод ошибки, используйте some-command &> /dev/null. – Eliah Kagan 13 June 2012 в 01:22
  • 2
    Да, это была моя первая мысль при написании вышеупомянутого сценария. Я забываю, почему я не использовал это, возможно, какое-то нестандартное поведение, которое обошло это решение. Я знаю, что подробный / интерактивный режим по умолчанию используется для некоторых команд (я смотрю на ВАС, scp!), Что означает, что вам нужно использовать выходной результат для плавной работы сценариев оболочки. – Mange 13 June 2012 в 17:09

Хотя вы можете определить переменные среды в своем подходе, вы не находитесь в сценарии оболочки. Поэтому конструкции, подобные приведенным ниже, не будут работать:

SOME_DIR=/var/log
MY_LOG_FILE=${SOME_LOG}/some_file.log

BIN_DIR=/usr/local/bin
MY_EXE=${BIN_DIR}/some_executable_file

0 10 * * * ${MY_EXE} some_param >> ${MY_LOG_FILE}

Это связано с тем, что переменные не интерпретируются в crontable: все значения берутся литерально. И это то же самое, если вы опускаете скобки. Таким образом, ваши команды не будут выполняться, и ваши файлы журналов не будут записаны ...

Вместо этого вы должны определить все свои переменные среды прямо:

SOME_DIR=/var/log
MY_LOG_FILE=/var/log/some_file.log

BIN_DIR=/usr/local/bin
MY_EXE=/usr/local/bin/some_executable_file

0 10 * * * ${MY_EXE} some_param >> ${MY_LOG_FILE}
2
ответ дан 25 May 2018 в 23:19

Когда задача выполняется в cron, stdin закрывается. Программы, которые действуют по-разному на основе доступности stdin или нет, будут вести себя по-разному между сеансом оболочки и cron.

Примером является программа goaccess для анализа файлов журнала веб-сервера. Это НЕ работает в cron:

goaccess -a -f /var/log/nginx/access.log > output.html

и goaccess показывает страницу справки вместо создания отчета. В оболочке это можно воспроизвести с помощью

goaccess -a -f /var/log/nginx/access.log > output.html < /dev/null

Исправление для goaccess состоит в том, чтобы заставить его читать журнал из stdin вместо чтения из файла, поэтому решение состоит в том, чтобы изменить запись crontab на

cat /var/log/nginx/access.log | goaccess -a > output.html
2
ответ дан 25 May 2018 в 23:19

На моих серверах RHEL7 будут выполняться задания root cron, но пользовательские задания не будут. Я обнаружил, что без домашнего каталога задания не будут выполняться (но вы увидите хорошие ошибки в / var / log / cron). Когда я создал домашний каталог, проблема была решена.

2
ответ дан 25 May 2018 в 23:19

Если вы отредактировали свой файл crontab с помощью редактора Windows (через samba или что-то еще) и заменили строки с помощью \ n \ r или просто \ r, cron не будет запущен.

Кроме того, если вы используете /etc/cron.d/*, и один из этих файлов имеет в нем \ r, cron будет перемещаться по файлам и останавливаться, когда он попадает в плохой файл. Не уверен, что это проблема?

Использование:

od -c /etc/cron.d/* | grep \r
2
ответ дан 25 May 2018 в 23:19

В 16.04, если у вас есть эта ошибка в syslog

(CRON) error (can't fork)

try:

systemctl status cron.service

В результате:

Tasks: num_task (limit: 512)

If num_task близок к использованию предела:

systemctl set-property cron.service TasksMax=new_max

Замените new_max на подходящее значение.

2
ответ дан 25 May 2018 в 23:19

Другие вопросы по тегам:

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