Чому мій кронтаб не спрацьовував?


29

Я crontab -eдодавав наступний рядок до мого crontab:

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

Але я не бачу, щоб тестовий файл записаний. Це проблема з дозволом чи crontab не працює належним чином?

Я бачу, що процес кронів працює. Як я можу це налагодити?

Редагувати - Задайте питання Ubuntu про хороше запитання щодо crontab , на жаль, що досі мені не допомагає.

Редагувати 2 - Гм, здається, у моєму тестовому файлі є 214 рядків, це означає, що за останні 214 хвилин він писався щохвилини. Я не впевнений, у чому була проблема, але явно її немає.

Відповіді:


23

Є реалізація cron(не всі вони, і я не пам’ятаю, який вільний, але я стикався з одним під Linux), які перевіряють наявність оновлених файлів crontab щохвилини на хвилину і не розглядають нові записи до наступної хвилини . Тому вперше вогонь може зайняти до двох хвилин. Це може бути те, що ви спостерігали.


1
Я б здогадався Соларіс, чи, можливо, ранній Соларіс. У мене є звичка змушувати вхід у крон виконуватись 3-5 хвилин у майбутньому, коли я тестую сценарій із запису на кронтабі, тому що я весь час обманювався такою поведінкою.
Брюс Едігер

fcronробить це теж.
phunehehe

Що робити, якщо порядок "перевірки" коштує більше декількох хвилин? Під час цієї тривалої "перевірки", які не були спровоковані, з'являтимуться чіткості.
осіпдер

@ospider Перевірка займає лише частку секунди.
Жил "ТАК - перестань бути злим"

28

Після мого кронінгу є порожній рядок.
ripper234

4
Не порожній рядок, а новий рядок в кінці останнього рядка. Текстовий файл повинен складатися з послідовності рядків, кожен із яких закінчується новим рядком, тому будь-який не порожній текстовий файл закінчується символом нового рядка. Деякі утиліти нічого не обробляють після останнього нового рядка у файлі.
Жил "ТАК - перестань бути злим"

1
Це питання термінів, "символ нового рядка" означає "після цього символу починати новий рядок тексту". Тож 0 байт між останнім новим рядком та EOF також може розглядатися як порожній рядок ("рядок, що містить 0 символів")
gelraen

10

У мене була така ж проблема - робочий кронтаб несподівано зупинився після того, як я додав новий запис наприкінці. Виявилося, що я забув поставити нову лінію після цього останнього рядка.

Я це з’ясував, видавши команду

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)

Додавання нового рядка та збереження вирішили проблему.


5

Схоже, це фіксовано. Наступного разу спробуйте також записати STDERR. Наступне буде входити в STDOUT, а не STDERR:

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

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

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

Моя перевага - надсилати cronjob вихід у syslog. Таким чином я використовую будь-яку існуючу інфраструктуру системного журналу (централізовані системи, 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

І файловий скрипт не виконувався, тому я побіг

chmod +x my-script.sh

Відразу я почав бачити вихід, як очікувалося.


1

Ваша лінія cron працює чудово на моєму комп’ютері, коли я переходжу myusernaeна phunehehe. Існує кілька способів з’ясувати, що не так у вашій системі.

Cron зазвичай надсилає пошту користувачеві, коли щось не так. Якщо ви бачите повідомлення "У вас є пошта", скористайтеся поштовим клієнтом, щоб перевірити вашу поштову скриньку . Або перевірте у своєму домашньому каталозі, чи там може бути названий файл dead.letter.

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

Якщо у вас є кореневий доступ, ви можете зупинити демон cron і запустити його в режимі налагодження. Наприклад, я б використав (змінити fcronім'я вашого демона):

killall fcron
fcron --foreground --debug

Як дізнатись ім'я мого демона?
ripper234

@ ripper234 використовуйте, ps -ef | grep cronі ви повинні побачити рядок для свого крона. Перевірте чоловічу сторінку cron, щоб побачити прапор для налагодження. Цілком ймовірно, що ви використовуєте Vixie Cron , у такому випадку прапор налагодження є -x. Вбити процес крона і запустити його знову за допомогою додаткового прапора.
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), який ви хочете просто надіслати до вас, ви можете уникнути поштової скриньки кореневої пошти або кореневої адреси кореневої пошти.


Я не знаю, чи налаштовано сервер SMTP / сервер вихідної пошти. Шанси, що це не так.
ripper234

1

Я б припустив, що однією з причин цього може бути те, що / home / каталог зашифровано, і коли користувач вийшов із системи, cron не може зробити нічого в цьому каталозі.

дивіться: /programming//a/40354269/1279002

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.