Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell &引用;getpwnam()失败";仅当从cron调用时在/bin/sh中_Shell_Cron_Sh_Crontab - Fatal编程技术网

Shell &引用;getpwnam()失败";仅当从cron调用时在/bin/sh中

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

以下是我的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.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项的自然方式。(这就是我今天遇到这个问题的原因。)这应该是公认的答案。