"getpwnam() не удалось" в /bin/sh только при вызове cron
Здесь содержимое моего файла crontab:
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO="[email protected]"
*/5 * * * * sh /robot/1/master.sh >/dev/null 2>&1
*/5 * * * * sh /robot/2/master.sh >/dev/null 2>&1
*/5 * * * * sh /robot/3/master.sh
*/5 * * * * sh /robot/4/master.sh >/dev/null 2>&1
*/5 * * * * sh /robot/5/master.sh >/dev/null 2>&1
Это ошибка, которая продолжает отображаться в /var/log/cron
при попытке запустить:
crond[669]: (sh) ERROR (getpwnam() failed)
Если я запускаю любой из этих файлов вручную, они работают без каких-либо проблем.
Что случилось с файлом crontab?
Ответы
Ответ 1
Меня удивляет, что никто не имеет на это правильного ответа. Сегодня я столкнулся с такой же проблемой, и Google не помог.
Через 2 часа я обнаружил, что при размещении файла в /etc/cron.d строка расписания должна содержать дополнительную опцию.....
Я всегда использую это для моего crontab -e
# Minute Hour Day of Month Month Day of Week Command
# (0-59) (0-23) (1-31) (1-12 or Jan-Dec) (0-6 or Sun-Sat) /my/fancy/script.sh
Таким образом, он содержит 6 предметов.
Поместив это в файл внутри /etc/cron.d, cron нуждается в дополнительной опции, являющейся пользователем для запуска вашего фантазии/скрипта.
# Minute Hour Day of Month Month Day of Week Who Command
# (0-59) (0-23) (1-31) (1-12 or Jan-Dec) (0-6 or Sun-Sat) root /my/fancy/script.sh
Это зафиксировано в man crontab (5). Например https://linux.die.net/man/5/crontab. В нем говорится:
Работа в /etc/cron.d/
Задачи в cron.d - это системные задания, которые обычно используются для нескольких пользователей. Это причина, по которой требуется имя пользователя. MAILTO в первой строке не является обязательным.
Ответ 2
Шестая позиция зарезервирована для имени пользователя, выполняющего задание. Вы указали пользователя с именем sh
который, скорее всего, не присутствует на машине.
Ответ 3
простой ответ на ваш crontab, вам нужно указать пользователя для запуска команды
Пример для запуска в качестве ROOT:
0,10,20,30,40,50 * * * * root/path_to_script/script_name
или запустить от имени пользователя FRED
0,10,20,30,40,50 * * * * fred/path_to_script/script_name
по умолчанию без указания пользователя USER - запуск от имени пользователя CRON, и у этого пользователя не будет разрешений на выполнение сценария.
Ответ 4
Ничего плохого в файле crontab (пока "мой" crontab, вы имеете в виду, что это пользователь crontab, а не система crontab, в противном случае см. Другой ответ).
С другой стороны, что-то не так с вашей службой системных каталогов - как nsswitch.conf
в Linux, с помощью nsswitch.conf
. Возможно, вы используете хранилище LDAP с проверкой подлинности Kerberos, и ваш демон cron не имеет токена Kerberos для подключения к нему (или изолирован, как и SELinux, не имеет доступа к сети); возможно, это хранилище файлов, которое не читается пользователем, чей crontab запускается; возможно, какая-то другая странная и интересная вещь продолжается.
getpwnam()
- это вызов библиотеки C, который выполняет поиск имени текущего пользователя. Если ваша раковина была bash, она вернулась бы к имени у I have no name!
- поэтому эта ошибка означает, что ваша реализация sh
является чем-то другим. (Если вы хотите запускать свои скрипты с помощью bash, используйте bash
, а не sh
).
Ответ 5
Мы можем создавать рабочие места cron для системы, а также для отдельных лиц. Crontab в /etc/crontab
специально используется для системных cronjobs. Поэтому вам нужно указать команду cronjob, которую вы выполняете. В вопросе имя пользователя не указано. Следовательно, возникает ERROR (getpwnam() failed)
. Вы можете создавать пользовательские cronjobs в /var/spool/cron/username
ПРИМЕЧАНИЕ :: Задания Cron очень полезны, но катастрофичны при сбоях!