这是我的 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 文件有什么问题?
令我惊讶的是,没有人能给出正确的答案。今天我遇到了完全相同的问题,谷歌没有帮助。
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 需要一个额外的选项,作为运行您的 fancy/script 的用户。
# 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 是可选的。
第六个位置是为运行作业的用户名保留的。您指定了一个名为
sh
的用户,该用户很可能不存在于计算机上。
简单回答 在你的 crontab 上,你需要指定用户来运行命令
以 ROOT 身份运行的示例是:-
0,10,20,30,40,50 * * * * 根/脚本路径/脚本名称
或以用户 FRED 身份运行
0,10,20,30,40,50 * * * * 弗雷德/脚本路径/脚本名称
未指定 USER 的默认情况是以用户 CRON 身份运行,并且该用户没有执行脚本的权限
我们可以为系统以及个人创建 cron 作业。
/etc/crontab
中的crontab专门用于系统cronjobs。所以需要指定cronjob命令由谁执行。在问题中未指定用户名。因此,出现了ERROR (getpwnam() failed)
。您可以在 /var/spool/cron/username
中创建用户特定的 cronjobs
注意:: Cron 作业非常有用,但失败时却是灾难性的!
crontab 文件没有任何问题(只要“我的”crontab 表示它是用户 crontab 而不是系统 crontab;否则,参见其他答案)。
另一方面,您系统的目录服务有问题——在 Linux 中使用
nsswitch.conf
配置。也许您正在使用经过 Kerberos 验证的 LDAP 存储,并且您的 cron 守护程序没有 Kerberos 令牌来连接到它(或者是沙箱,与 SELinux 一样,无法访问网络);也许它是一个文件存储,正在运行 crontab 的用户无法读取;也许正在发生其他一些奇怪而有趣的事情。
getpwnam()
是一个 C 库调用,用于查找当前登录用户的名称。如果你的 shell 是 bash,它会回退到名称 I have no name!
——所以这个错误意味着你的 sh
实现是不同的。 (如果您想使用 bash 运行脚本,请使用 bash
,而不是 sh
)。
如果有人偶然发现这个:
我也遇到过类似的问题。我的错误消息是:
(root)错误(getpwnam()失败)
解决方案是删除 crontabs 行中除用户名 root 周围的一个空格之外的所有空格。 我只在一台机器上遇到这个问题,其他机器上有更多空白的同一行到目前为止工作正常......