Что не так с моей конфигурацией cron.hourly?
Каждый час я получаю электронное письмо с такой ошибкой,
Subject: Cron <root@supa> root cd / && run-parts --report /etc/cron.hourly
/bin/sh: root: not found
Содержимое /etc/crontab выглядит следующим образом: либо я удаляю пользователя "root", либо нет (6-й столбец), я получаю ту же ошибку.
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# m h dom mon dow user command
11 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6 * * 7 test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6 1 * * test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
#
В моем каталоге cron.hourly есть два файла:
$ ll /etc/cron.hourly/
total 0
lrwxrwxrwx 1 root root 25 2009-10-29 09:24 ntpsync -> /home/<user>/bin/ntpsync
lrwxrwxrwx 1 root root 28 2009-10-23 10:33 foo -> /home/<user>/bin/foo
Первый сценарий гласит:
$ cat ~/bin/ntpsync
#!/usr/bin/env bash
echo "user: $USER"
if [[ "$USER" == "root" ]] ; then
ntpdate ntp.ubuntu.com
else
sudo ntpdate ntp.ubuntu.com
fi
Даже если я удалю оба скрипта в своем каталоге /etc/cron.hourly/, я получаю одно и то же сообщение об ошибке каждый час. Я попытался перезапустить cron, и я все еще получаю то же сообщение об ошибке. Следующая идея, которую я имею, состоит в том, чтобы перезагрузить, но я избежал бы этого.
$ sudo /etc/init.d/cron restart
Моя версия Ubuntu выглядит следующим образом,
$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=8.04
DISTRIB_CODENAME=hardy
DISTRIB_DESCRIPTION="Ubuntu 8.04.1"
Обновление: я удалил шестой столбец "root" из моего файла /etc/crontab ранее, потому что, когда я искал в Интернете, кто-то упоминал, что может решить эту проблему. Теперь я думаю, что проблема заключалась в том, что я возился с конфигурацией системного crontab вместо конфигурации root.
$ sudo crontab -l
# m h dom mon dow command
17 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
5 ответов
Файл crontab по умолчанию из пакета cron (3.0pl1-100ubuntu2.1, это последняя версия ubuntu 8.04) выглядит следующим образом:
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# m h dom mon dow user command
17 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
Вы должны просто взять это и вставить его в файл, но вы также можете убедиться, что у вас установлена последняя версия пакета. Вы можете сделать это, выполнив:
apt-get update
apt-get install cron
Обновить:
Существует два разных типа crontab. Один из них - системный crontab, расположенный в /etc/crontab
, Этот crontab имеет этот fromat:
minute hour dayOfMonth month dayOfWeek userToRunAs restOfLineIsCommand
Другой тип - это пользовательский crontab, который можно изменить, используя crontab
, Фактическая конфигурация находится в /var/spool/cron/crontabs/USERNAME
и всегда выполняется как пользователь, которому он принадлежит, и формат этого файла:
minute hour dayOfMonth month dayOfWeek restOfLineIsCommand
Ваш /etc/crontab
выглядит действительно смешно. На самом деле каждая строка должна иметь пользовательский столбец, что является самой забавной частью. Например, мой читает:
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# m h dom mon dow user command
17 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
#
Кстати, трогать этот файл обычно не очень хорошая идея. Если вам нужно добавить больше общих crontabs, используйте /etc/cron.d
за это. Вы можете попробовать восстановить конфигурацию по умолчанию для пакета cron:
$ sudo apt-get install --reinstall --yes -o DPkg::Options::=--force-confmiss -o DPkg::Options::=--force-confnew cron
и посмотреть, если это решит проблему.
Я знаю, что вы сказали, что по-прежнему получаете ошибки после удаления "корня" в шестом столбце, но это действительно похоже на проблему.
Например, посмотрите на другие строки. Все они начинаются с "теста". Это не пользователь, это начало команды. Удаление "root" заставит вашу команду начинаться с "cd".
Тем более что в сообщении об ошибке говорится, что он не может найти "root", то есть ошибку, которую вы получаете, когда пытаетесь запустить программу, которая не существует.
Так что я бы сказал, попробуйте удалить это снова.
Здесь действительно две проблемы. Один (более очевидный) - неправильный 6-й столбец в личном crontab пользователя root. Второй безмолвный - это когда-либо команда после почасовой линии cron в /etc/crontab
не выполняется должным образом. Исправления приведены ниже:
Вы можете удалить файл фиктивного пользователя crontab, запустив sudo crontab -r
После этого вам нужно добавить пользователя root в /etc/crontab
файл для каждой строки после ежечасной строки cron - примерно так:
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# m h dom mon dow user command
11 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
#
Это должно решить эти проблемы с электронной почтой.
Сделай это:
# crontab -r
И НЕ делайте этого
# crontab /etc/crontab
Вместо этого редактирует файл /etc/crontab вручную.