Shell &引用;getpwnam()失败";仅当从cron调用时在/bin/sh中
以下是我的crontab文件的内容:Shell &引用;getpwnam()失败";仅当从cron调用时在/bin/sh中,shell,cron,sh,crontab,Shell,Cron,Sh,Crontab,以下是我的crontab文件的内容: SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO="example@example.com" */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
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO="example@example.com"
*/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文件有什么问题?crontab文件没有任何问题(只要“我的”crontab,您的意思是它是用户crontab而不是系统crontab;否则,) 另一方面,系统的目录服务有问题——在Linux中,使用
nsswitch.conf
配置的目录服务。也许您使用的是经过Kerberos身份验证的LDAP存储,而您的cron守护进程没有连接到它的Kerberos令牌(或者像SELinux一样是沙盒,没有网络访问权);可能是运行crontab的用户无法读取的文件存储;也许还有一些奇怪而有趣的事情正在发生
getpwnam()
是一个C库调用,用于查找当前登录用户的名称。如果您的shell是bash,它将返回到名称我没有名字代码>--所以这个错误意味着您的sh
实现有所不同。(如果您想用bash运行脚本,请使用bash
,而不是sh
)。我很惊讶,没有人能给出正确的答案。今天,我面临着完全相同的问题,而谷歌没有提供帮助
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)中有记录。例如它说:
作业在/etc/cron.d/
cron.d中的作业是系统作业,通常用于多个用户。这就是为什么需要用户名的原因。第一行的MAILTO是可选的。第六个位置是为运行作业的用户名保留的。您指定了一个名为sh
的用户,该用户很可能不在计算机上。简单答案
在crontab上,需要指定运行命令的用户
以ROOT用户身份运行的示例如下:-
0,10,20,30,40,50****根/路径到脚本/脚本名称
或者以用户FRED身份运行
0,10,20,30,40,50****fred/path_to_script/script_name
默认情况下,如果未指定用户,则作为用户CRON运行,并且该用户没有执行脚本的权限我们可以为系统以及个人创建CRON作业。/etc/crontab
中的crontab专门用于系统crontjob。因此,您需要指定由谁执行的cronjob命令。问题中未指定用户名。因此出现错误(getpwnam()失败)
。您可以在/var/spool/cron/username
注意::Cron作业非常有用,但一旦失败,它将是灾难性的放在一边:sh
不是bash
(即使它是bash的一个符号链接,它也在兼容模式下运行,转换了许多功能)。如果您没有实际使用bash,请不要将问题标记为bash。您是尝试每半分钟还是每5分钟运行一次cron?*/5意味着它将以5的步长每分钟运行一次。总之,getpwnam()failed
通常非常简单。您系统的目录服务/存储是什么?例如,如果它被配置为与需要Kerberos身份验证的对象进行通信,那么您的cron作业可能没有有效的票证……也就是说:问题实际上与您的crontab文件无关,而是与您的系统的目录服务(提供信息getpwnam()
已配置对--的查询。这意味着要在系统的配置中进行一点挖掘。@DanielCortés*/5意味着它将每5分钟运行一次。呵呵。很好的一点——如果您有一个缺少字段的系统crontab,我们将寻找一个名为sh
的用户,这肯定会导致getpwnam()
失败。甚至我的VPS的系统管理员都不知道是什么导致了它。哈哈,顺便说一句,为什么使用路径/etc/cron.d/
而不是/etc/crontab
?我使用目录/etc/cron.d
,因为我可以为每个任务创建一个具有描述性名称的文件。因为我喜欢这样/etc/crontab
是一个我从未修改过的文件。@Anthony:这也是添加包所拥有的crontab项的自然方式。(这就是我今天遇到这个问题的原因。)这应该是公认的答案。