Crontab никогда не работает в /etc/cron.d

32

Вот что я сделал на Debian Jessie:

  • установить cron через apt-get install cron
  • положить backup_crontabфайл в/etc/cron.d/

Однако задача никогда не выполняется.

Вот некоторые выводы:

/# crontab -l
no crontab for root

/# cd /etc/cron.d && ls
backup_crontab

/etc/cron.d# cat backup_crontab
0,15,30,45 * * * * /backup.sh >/dev/null 2>&1

Что-то нужно сделать, чтобы активировать конкретный crontab или активировать «службу» cron сам по себе?

Дживан
источник
4
Что если он работает и завершается с ошибкой, которую вы не видите, потому что перенаправляете весь вывод в / dev / null? :)
Тинк
@tink можно ли вместо этого добавить вывод в конец файла?
Дживан
2
уверенный; 0,15,30,45 * * * * /backup.sh >> / tmp / testing_cron.out 2> & 1
tink
@Jivan, просто небольшая заметка: ls /etc/cron.dэквивалентно с cd /etc/cron.d && lsточки зрения производства. Разница лишь в том, что рабочий каталог не изменится.
Дрю Чапин

Ответы:

49

Файлы /etc/cron.dнеобходимо также перечислить пользователя о том , что работа должна быть запущена под.

т.е.

0,15,30,45 * * * * root /backup.sh >/dev/null 2>&1

Вы также должны убедиться, что права доступа и владелец: группа установлены правильно ( -rw-r--r--и принадлежат root:root)

Стивен Харрис
источник
16
crontab -lотчеты о записях cron в /var/spool/cron/crontabs/- т.е. crontabs на пользователя . /etc/cron.dфайлы являются системными crontabs и не сообщаются crontab -l.
Стивен Харрис
5
На самом деле я упомянул, что это не работает, но я только что понял, что это после добавления rootв файл - просто crontab -lне упомянул об этом, как вы объяснили почему - спасибо за вашу помощь
Дживан
9
кажется, что имя файла также играет роль. В моем случае я добавил etc/cron.dфайл с точкой в ​​середине имени, и задание так и не было выполнено, пока я его не переименовал
рис.
20
та же проблема здесь, тире "-" в имени файла, изменение их на подчеркивания "_" решили проблему, задания выполнялись немедленно.
Роб
1
У меня тоже была тире ... что за .... почему ?! В любом случае, спасибо @Rob
Николай Димитров
8

Еще я заметил, что файл /etc/cron.dне может иметь расширение. В моем конкретном случае у меня была символическая ссылка:

# my-job.crontab
* * * * * root echo "my job is running!" >> /tmp/my-job.log

$: ln -sf /home/me/my-job.crontab /etc/cron.d/
# This did not work -> job would not run

$: ln -sf /home/me/my-job.crontab /etc/cron.d/my-job
# This did work -> job ran fine

Ограничения имен файлов задокументированы на странице руководства по части выполнения: http://manpages.ubuntu.com/manpages/xenial/man8/run-parts.8.html , можно передать параметр --regex для переопределения формата файла.

Однако поведение cron по умолчанию осталось без расширений, см. Комментарии по адресу : https://bugs.launchpad.net/ubuntu/+source/debianutils/+bug/38022.

Rodrigo-Силвейра
источник
Чувак, ты спас мой день!
elboletaire
2
Это верно в Ubuntu (возможно, во всех дистрибутивах, производных от Debian). В Amazon Linux (и, возможно, во всех дистрибутивах, созданных на Redhat), у вас может быть точка в имени файла. Спасибо Unix.SE.
Закон 29
Я только что проверил чистый Debian, и точки там тоже не работают. Тире работают (в отличие от того, что написано выше).
Закон 29
4

Я думаю, что вы, вероятно, просто пропустили необходимую пустую строку в конце вашего файла cron. У меня была та же проблема, но после проверки всего перечисленного здесь (пользовательские права, имя файла, версия cron и т. Д.) Я понял, что после последней записи в моем /etc/cron.d/own_cronфайле не было разрыва строки, и это приводит к игнорированию всего файла.

slac1024
источник
2

Если вы единственный пользователь на этом компьютере, вы можете использовать только crontab -e. Вам будет предложено выбрать редактор при первом запуске команды. Затем вы можете добавить это к нему:

0,15,30,45 * * * * /backup.sh >/dev/null 2>&1

Если вы переключитесь на учетную запись обычного пользователя, вам нужно будет использовать sudo crontab -eдля настройки сценариев, которые вы хотите запускать по расписанию root.

crontab -lотображает только текущий crontab, как только вы настроите его с помощью crontab -e. Если у вас есть файл cron в /etc/cron.d/, он не будет отображаться с crontab -l.

Вы также должны убедиться , что ваш скрипт исполняемым: chmod +x /backup.sh.

CLK
источник
1
спасибо - в этом случае crontab установлен в контексте, Dockerfileтак что я не могу этого сделать crontab -e- но в любом случае это полезная информация
Jivan
2

Для Cron из * bian distros (например, Raspbian) вам нужно включить -lпараметр демона Cron. Это целесообразно сделать с помощью /etc/default/cronконфигурационного файла, включив EXTRA_OPTS.

постучать по дереву
источник
Это было опровергнуто, но в некоторых случаях оно является правильным, хотя и не объяснено. В дистрибутивах на основе Debian -lопция для демона cron авторизует расширенный набор имен файлов в /etc/cron.dкаталоге, поэтому, если файл игнорируется, поскольку в нем есть точка, то либо «добавление -l», либо «удаление точки» исправит проблему.
Закон 29
1

Проверьте вашу версию cron.

Кажется, что если вы используете crond Диллона, вам не нужен пользователь в /etc/cron.dзаписи.

Я понял это после того, как чуть не выдернул оставшиеся волосы.

У меня есть несколько записей, которые были /etc/cron.dдобавлены различными установками. После некоторого расследования я обнаружил, что один из них работает. У него не было пользователя. Таким образом, я взял пользователя из других. И они начали работать.

Джеймс Нельсон
источник