Почему не работает моя cron.d в минуту?

33

Я бросил кучу дротиков, пытаясь заставить мой скрипт на python выполняться каждую минуту. Поэтому я решил упростить это, чтобы просто делать «простейшую вещь, которая могла бы работать» один раз в минуту (я запускаю debian / testing).

Я создал однострочный файл в /etc/cron.d/perminute:

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

Он принадлежит пользователю root и является исполняемым (не уверен, имеет ли это значение). И тогда я сделал:

sudo service cron reload

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

Очевидно, здесь что-то упущено.

Трэвис Григгс
источник
3
Перезагрузка службы демона cron для применения изменений в cron.d обычно не требуется, так как в любом случае она повторно сканирует каталог на наличие новых и обновленных файлов каждую минуту.
Иосип Роден

Ответы:

45

При добавлении конфигурации cron в /etc/cron.d/или в /etc/crontabвы должны добавить имя пользователя, в каком контексте должна выполняться команда, в вашем примере

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

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

noggerl
источник
9
Это заставило меня идти в правильном направлении. Это был головокружительный момент. Я исправил это, и все же это все еще не работало. Прочитав man cronнемного медленнее и обратив особое внимание на DEBIAN specificразделы, я заметил, что файлы НЕ должны быть групповыми или другими доступными для записи. Что я включил в свое разочарование в один момент.
Трэвис Григгс
Не могли бы вы также просто поменять владельца скрипта на root?
Геремия
Эта конкретная линия помогла мне. From 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/ могут содержать только буквенно-цифровые символы, '-' и '_'. Конкретно без точек.
Март
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
terdon
источник
6
Нет абсолютно никаких оснований говорить, что cron.d «не очень хорошая идея». Демон cron отправит выходные данные cron.d stderr на имя пользователя, и, если вы хотите перенаправить его на другой адрес электронной почты, переменная MAILTO доступна.
Иосип Роден
@JosipRodin - это не очень хорошая идея для вещей, которые не запускаются пользователем root и которые созданы вами. Это имеет смысл для системного администратора в многопользовательской системе, но на вашей собственной машине проще иметь все в вашем собственном crontab, так что есть только одно место, чтобы проверить и crontab -lперечислить все ваши задания cron.
Тердон
Это предполагает, что это на самом деле просто личная работа cron, которую OP не особо прояснил - как правило, существует множество приложений для непривилегированных пользовательских задач cron, настроенных через cron.d, таких как хранение их всех в одном месте, несмотря на то, что у вас это хорошо получается. секвестрированные пользователи сервиса, автоматическое развертывание проще и т. д.
Йосип Роден
@JosipRodin абсолютно. Я предположил личную систему, потому что i) корпоративные системы здесь не по теме и ii) вопрос, предложенный неопытным пользователем.
Тердон
Хорошо, я думаю, что больше не читаю об этом из-за общей путаницы между сайтами superuser и serverfault и unix SE :)
Josip Rodin
2

Возможная ошибка здесь заключается в том, как создается однострочный файл . Из документации по Ubuntu :

... строка содержит пять полей времени и даты, за которыми следует команда, за которой следует символ новой строки .

Например, этот способ создания не работает:

printf "* * * * * /bin/touch /home/me/ding_dong" > /etc/cron.d/ding_dong
okoloBasii
источник