"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 очень полезны, но катастрофичны при сбоях!