задание linux debian crontab не выполнено

У меня есть bash-скрипт foo.sh, расположенный в каталоге /etc/cron.daily, chmoded 700, владельцем root, список crontab для пользователя root не изменился (crontab -l) из основной установки Debian. Я запускал cronjob не так, как crontab -l и/или crontab -e (например, я не перезапускал демон cron с помощью /etc/init.d/cron, как рекомендуется в конкретном случае Debian). Несмотря на то, что файл тестового задания выполняется в аналогичных условиях. Сценарий отлажен и может выполняться как отдельная задача без возврата ошибок. Я также проверил журналы (/var/log/syslog), и там все в порядке.

Но: это конкретное задание вообще не выполняется.


person hornetbzz    schedule 30.03.2011    source источник


Ответы (3)


Упс. Думаю, я нашел «почему» или, по крайней мере, «как»:

Только переименование файла задания без расширения ".sh" решило эту проблему.

Я думал, что это ошибка Debian, но это не так, как описано в других ответах ниже.

РЕШЕНИЕ: переименуйте скрипт, удалив все символы . или + из его имени.

person hornetbzz    schedule 30.03.2011
comment
Это специфично для дебиана. Это не ошибка, насколько они заинтересованы. - person Glen Solsberry; 30.03.2011
comment
@ gms8994: спасибо, но я нигде не нашел этого пункта об именах файлов заданий. Я нашел это специально, проводя дихотомические тесты. - person hornetbzz; 30.03.2011
comment
Я нашел это таким же образом; см. мой вопрос для получения дополнительной информации. - person Glen Solsberry; 30.03.2011

сценарии /etc/cron.daily выполняются частями запуска (см. man 8 run-parts).

там вы идете с фрагментом из man-страницы:

Если не указан ни параметр --lsbsysinit, ни параметр --regex, то имена должны полностью состоять из букв верхнего и нижнего регистра, цифр, знаков подчеркивания и дефисов.

из /etc/crontab вы можете увидеть, что ежедневные задания cron выполняются с:

25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )

debian не использует anacron, и для частей запуска не указан параметр --lsbsysinit (в этом случае '.' будет приниматься в имени файла сценария cron в соответствии с иерархическим и зарезервированным пространством имен LSB)

в любом случае, чтобы убедиться, что cron запустит ваш скрипт, вы всегда можете запустить run-parts и убедиться, что ваш скрипт указан в выводе run-parts:

run-parts --test /etc/cron.daily

or

run-parts --list /etc/cron.daily

Надеюсь, мой комментарий поможет вам понять, в чем была настоящая проблема.

person user237419    schedule 30.03.2011
comment
да, это помогает мне лучше понять фон cronjob. Я не знал об этих моментах. Спасибо + 1 балл. - person hornetbzz; 30.03.2011
comment
отличный ответ - вы только что сэкономили мне время на отладке. - person Artur Marnik; 31.01.2012
comment
Даже если вы использовали --lsbsysinit, run-parts все равно не примет foo.sh. Однако он примет foo.-sh. Он должен соответствовать этому регулярному выражению: ^_?([a-z0-9_.]+-)+[a-z0-9]+$ - person wisbucky; 12.03.2015
comment
Могу ли я проверить свой crontab? - person chovy; 12.12.2015

Все ответы, данные ранее, хороши и приемлемы для вопроса. Тем не менее, я считаю, что должен также добавить свою точку зрения, чтобы прояснить, что ОС Debian Linux не поддерживает имена файлов заданий cron, которые содержат символы . или +. См. соответствующий раздел в < href="http://www.debian.org/doc/debian-policy/" rel="nofollow">Руководство по политике Debian.

Так что это просто, чтобы избежать путаницы, что это не ошибка. Так работает Дебиан.

person miklosq    schedule 25.02.2014
comment
Привет слагстер, спасибо за усилия по редактированию. Для меня не имеет особого значения, как это называется «точка» или «точка» или вообще никак. Для меня это означает то же самое. Теперь это ясно, просто прочитав знак. - person miklosq; 03.03.2014