“getpwnam() 失败”

问题描述 投票:0回答:6

这是我的 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 文件有什么问题?

shell sh cron
6个回答
109
投票

令我惊讶的是,没有人能给出正确的答案。今天我遇到了完全相同的问题,谷歌没有帮助。

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 是可选的。


4
投票

第六个位置是为运行作业的用户名保留的。您指定了一个名为

sh
的用户,该用户很可能不存在于计算机上。


2
投票

简单回答 在你的 crontab 上,你需要指定用户来运行命令

以 ROOT 身份运行的示例是:-

0,10,20,30,40,50 * * * * 根/脚本路径/脚本名称

或以用户 FRED 身份运行

0,10,20,30,40,50 * * * * 弗雷德/脚本路径/脚本名称

未指定 USER 的默认情况是以用户 CRON 身份运行,并且该用户没有执行脚本的权限


1
投票

我们可以为系统以及个人创建 cron 作业。

/etc/crontab
中的crontab专门用于系统cronjobs。所以需要指定cronjob命令由谁执行。在问题中未指定用户名。因此,出现了
ERROR (getpwnam() failed)
。您可以在
/var/spool/cron/username

中创建用户特定的 cronjobs

注意:: Cron 作业非常有用,但失败时却是灾难性的!


0
投票

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
)。


0
投票

如果有人偶然发现这个:

我也遇到过类似的问题。我的错误消息是:

(root)错误(getpwnam()失败)

解决方案是删除 crontabs 行中除用户名 root 周围的一个空格之外的所有空格。 我只在一台机器上遇到这个问题,其他机器上有更多空白的同一行到目前为止工作正常......

© www.soinside.com 2019 - 2024. All rights reserved.