Чому мій cron.d за хвилину не працює?


32

Я кинув купу дротиків, які намагаються виконати мій скрипт python для виконання кожної хвилини. Так що я думав, що спрощу його зробити просто "найпростіше, що могло б працювати" раз на хвилину (я запускаю debian / тестування).

Я створив один рядок у файлі /etc/cron.d/perminute:

* * * * * /bin/touch /home/me/ding_dong

Він є власником кореня і виконуваним файлом (не впевнений, що будь-який з них має значення). І тоді я зробив:

sudo service cron reload

А потім відкиньтеся і почніть бігти ls -ltr знову й знову в моєму домашньому каталозі ( /home/me ). Але мій файл ding_dong ніколи не з'являється. Я знаю, чи можу я це зробити sudo /bin/touch /home/me/ding_dong, вона з'являється відразу.

Очевидно, що тут відсутній щось дурне.


3
Перезавантаження служби cmon daemon, щоб застосувати зміни до cron.d, зазвичай не потрібне, оскільки вона щонайменше повторно скасовує каталог для нових і оновлених файлів.
Josip Rodin

Відповіді:


43

При додаванні конфігурації cron в /etc/cron.d/ або в /etc/crontab Ви повинні додати ім'я користувача, у якому контексті команда повинна виконуватися у вашому прикладі

* * * * * root /bin/touch /home/me/ding_dong

І лише натяк на мене: вам не потрібно починати бігати ls -ltr знову і знову, просто використовуйте watch -n 5 "ls -ltr" і вона буде запускати команду кожні 5 секунд (або будь-яке інше значення, замінюючи 5 тим, що ви хочете).


9
Це змусило мене йти в правильному напрямку. Це був момент голови. Я це виправив, і все ж він все ще не працював. Після читання man cron трохи повільніше, і приділяючи особливу увагу DEBIAN specific розділи, я помітив, що файли повинні НЕ бути груповим або іншим доступним для запису. Що я ввімкнув у своєму розчарування в одній точці.
Travis Griggs

Чи не могли ви просто змінити власника сценарію на корінь?
Geremia

Ця конкретна лінія допомогла мені. Від man cron: Крім того, у Debian cron читає файли в каталозі /etc/cron.d. cron обробляє файли в /etc/cron.d так само, як файл / etc / crontab (вони слідують спеціальному формату цього файлу, тобто. вони включають поле користувача ). Однак вони не залежать від / etc / crontab: вони, наприклад, не успадковують від нього налаштування змінної середовища. Ця зміна стосується Debian, див. Примітку в розділі DEBIAN SPECIFIC нижче.
harperville

man 8 cron (на Debian) також каже, що файли в /etc/cron.d/ можуть містити лише буквено-цифрові символи, '-' і '_'. Зокрема, немає точок.
mpartel

3

Створити нове cron Ви повинні працювати crontab -e як користувача, яким потрібно виконати завдання. Потім додайте відповідний рядок у вікно редактора:

* * * * * /bin/touch /home/me/ding_dong

Те, як ви це робите, вимагає іншого формату і насправді не є гарною ідеєю. Crontabs в /etc/cron.d мають трохи інший формат, вони вимагають, щоб ім'я користувача працювало під. Наприклад:

* * * * * USERNAME /bin/touch /home/me/ding_dong

Хороший прийом (як запропоновано @VogonPoetLaureate) полягає в тому, щоб зафіксувати стандартну помилку ваших завдань cron, які можуть допомогти їх налагодити. Наприклад:

* * * * * /bin/touch /home/me/ding_dong 2>/tmp/error

6
Немає ніяких підстав стверджувати, що cron.d "не є гарною ідеєю". Демон cron надсилатиме вивід cron.d stderr до імені користувача, і якщо ви хочете перенаправити його на іншу адресу електронної пошти, доступна змінна MAILTO.
Josip Rodin

@JosipRodin це не гарна ідея для речей, які не запускаються корінням і які налаштовані вами. Це має сенс для системного адміністратора на багатокористувацькій системі, але на вашому власному комп'ютері, простіше мати все, що є у вашому власному кронтабі, так що єдине місце для перевірки та crontab -l перераховує всі ваші завдання cron.
terdon

Це припускає, що це дійсно лише особиста робота cron, яку оператор OP насправді не уточнив - як правило, існують численні програми для непривілейованих користувачів cron, створених через cron.d, наприклад, збереження їх у одному місці, незважаючи на те, що ви добре користувачам пошкоджених служб, автоматичне розгортання та ін.
Josip Rodin

@JosipRodin абсолютно. Я припустив, що персональна система, тому що i) корпоративні системи тут відсутні і ii) питання запропоновано користувачеві, що не є експертом.
terdon

Добре, я припускаю, що я більше не читати в тому, що з-за загальної плутанини між суперкористувача і serverfault і Unix SE сайтів:) \ t
Josip Rodin

2

Можлива помилка як єдиний файл рядка створено. Від Документація Ubuntu :

... рядок має п'ять полів часу та дати, за якими йде команда   слідом за a символ нового рядка .

Наприклад, цей спосіб створення не працює:

printf "* * * * * /bin/touch /home/me/ding_dong" > /etc/cron.d/ding_dong
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.