Почему мой crontab не сработал?

29

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

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

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

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

Edit - Ask Ubuntu имеет хороший вопрос о crontab , но, к сожалению, он все еще не помогает мне.

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

ripper234
источник

Ответы:

23

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

Жиль "ТАК - перестань быть злым"
источник
1
Я предположил бы Солярис, или возможно ранний Солярис. У меня есть привычка заставлять запись cron запускаться через 3-5 минут в будущем, когда я тестирую скрипт из записи crontab, потому что я все время обманывал это поведение.
Брюс Эдигер
fcronделает это тоже.
phunehehe
Что делать, если процедура «проверки» стоит больше нескольких минут? Там будут cronjobs, которые должны быть запущены во время этой длительной «проверки», которые не были запущены.
ospider
@ospider Проверка занимает доли секунды.
Жиль "ТАК - перестань быть злым"
28

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

gelraen
источник
После моего cronjob есть пустая строка.
ripper234
4
Не пустая строка, а новая строка в конце последней строки. Предполагается, что текстовый файл состоит из последовательности строк, каждая из которых заканчивается новой строкой, поэтому любой непустой текстовый файл заканчивается символом новой строки. Некоторые утилиты ничего не обрабатывают после последней новой строки в файле.
Жиль "ТАК - перестань быть злым"
1
Это вопрос терминов, «символ новой строки» означает «после этого символа начать новую строку текста». Таким образом, 0 байтов между последней новой строкой и EOF также могут рассматриваться как пустая строка («строка, содержащая 0 символов»)
gelraen
10

У меня была такая же проблема - рабочий 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)

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

uniomni
источник
5

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

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

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

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

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

* * * * * echo hi >> /home/myusername/test 2>&1 | /usr/bin/logger -t mycronjob
Стефан Ласевский
источник
2

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

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

И файл myscript не был исполняемым, поэтому я запустил

chmod +x my-script.sh

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

Сантьяго Аристи
источник
1

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

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

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

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

killall fcron
fcron --foreground --debug
phunehehe
источник
Как мне узнать имя моего демона?
ripper234
@ ripper234 используйте, ps -ef | grep cronи вы должны увидеть строку для вашего cron. Проверьте man-страницу cron, чтобы увидеть флаг для отладки. Вполне вероятно, что вы используете Vixie Cron , в этом случае флаг отладки -x. Убейте процесс cron и запустите его снова с дополнительным флагом.
phunehehe
Также проверьте / var / log / syslog. В моем случае были предупреждения о том, что файл cron доступен для групповой записи.
хорошо относитесь к своим модам
1

Скорее всего, когда происходит сбой 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.

jsbillings
источник
Я не знаю, настроен ли в системе SMTP / сервер исходящей почты. Скорее всего, это не так.
ripper234
1

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

см .: /programming//a/40354269/1279002

theINtoy
источник