Почему мой кронтаб не срабатывал?

Я использовал crontab -e чтобы добавить следующую строку в мой crontab:

 * * * * * echo hi >> /home/myusername/test 

Тем не менее, я не вижу, чтобы файл теста был записан. Это проблема разрешения, или crontab работает неправильно?

Я вижу, что процесс cron запущен. Как я могу отладить это?

Изменить – спросить у Ubuntu хороший вопрос о crontab , к сожалению, это все равно не помогает.

Edit 2 – Хм, похоже, мой тестовый файл имеет 214 строк, что означает, что за последние 214 минут он был написан каждую минуту. Я не уверен, в чем проблема, но, похоже, она исчезла.

Существуют реализации cron (не все из них, и я не помню, что изначально, но я столкнулся с одним из них под Linux), которые проверяют обновленные файлы crontab каждую минуту в минуту и ​​не рассматривают новые записи до следующего минута. Таким образом, crontab может занять до двух минут для запуска в первый раз. Это может быть то, что вы наблюдали.

Вы добавили пустую строку после своей кроны ?

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

Я узнал, выпустив команду

 cat /var/log/syslog | grep crontab 

и выход показал проблему:

 Jul 2 08:16:01 shiva cron[1254]: (*system*) RELOAD (/etc/crontab) Jul 2 08:16:01 shiva cron[1254]: (*system*) ERROR (Missing newline before EOF, this crontab file will be ignored) 

Добавление новой строки и сохранение исправили проблему.

Похоже, это исправлено. В следующий раз попробуйте также запустить STDERR. Следующее будет записываться только в STDOUT, а не в STDERR:

 * * * * * echo hi >> /home/myusername/test 

Попытайтесь убедиться, что существует явное предложение для STDERR. В противном случае, STDERR может быть отправлен по электронной почте пользователю (при условии, что электронная почта работает) или может вообще никуда не уйти, в зависимости от конфигурации Cron.

 * * * * * echo hi >> /home/myusername/test 2> /home/myusername/test.stderr 

Мое предпочтение заключается в отправке вывода cronjob в syslog. Таким образом, я использую любую существующую инфраструктуру syslog (централизованные syslogs, Splunk, вращение журнала уже поддерживается, легко сравнивать сообщения в / var / log / messages & / var / log / cronjob и т. Д.), И я не спам системных администраторов (меня) с ненужными электронными письмами.

 * * * * * echo hi >> /home/myusername/test 2>&1 | /usr/bin/logger -t mycronjob 

Ваша линия cron отлично работает на моем компьютере, когда я меняю myusernae на phunehehe . Существует несколько способов узнать, что не так с вашей системой.

Cron обычно отправляет почту пользователю, когда что-то не так. Если вы видите сообщение «У вас есть почта», используйте почтовый клиент, чтобы проверить свой почтовый ящик . Или, проверьте свой домашний каталог, там может быть файл с именем dead.letter .

Вы можете проверить /var/log/ для записей, относящихся к cron. На моем компьютере файл журнала находится в /var/log/cron/current (требуется root-доступ).

Если у вас есть root-доступ, вы можете остановить демона cron и запустить его в режиме отладки. Например, я бы использовал (сменил fcron на имя вашего демона):

 killall fcron fcron --foreground --debug 

Скорее всего, когда cron выходит из строя, он генерирует электронное письмо для идентификатора пользователя задания cron на этом компьютере. Если у вас нет MTA, работающего на вашем компьютере, или вы не читаете или не пересылаете эту почту в другом месте, вы не увидите это сообщение, даже если MTA работает.

Хороший способ получить ваши ошибки crontab по почте – сделать так, чтобы ваш crontab выглядел так:

 MAILTO="myemail@example.com" * * * * * echo hi >> /home/myusernae/test 

Очевидно, используйте свой адрес электронной почты, а не myemail@example.com. Это указывает cron отправлять ошибки на ваш адрес электронной почты, а не на локальную учетную запись. В частности, это полезно, если у вас есть корневой crontab (или фрагмент crontab в /etc/cron.d), который вы хотите просто отправить вам, вы можете избежать рассылки почтового ящика root или адреса пересылки root.

Со мной проблема заключалась в том, что скрипт не был исполняемым. У меня была установка crontab -e

 * * * * * /bin/my-script.sh 

И файл myscript не был выполнен, поэтому я побежал

 chmod +x my-script.sh 

Сразу же я начал видеть результат, как ожидалось.

Я бы предположил, что одна из причин этого может заключаться в том, что каталог / home / зашифрован, и когда пользователь выходит из системы, cron не может ничего сделать в этом каталоге.

см. https://stackoverflow.com/a/40354269/1279002