“getpwnam()失败”只在从cron调用时才在/ bin / sh中

时间:2017-01-25 21:08:29

标签: shell cron sh crontab

以下是我的crontab文件的内容:

register

这是在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

如果我手动运行这些文件中的任何一个,它们都可以正常运行。

crontab文件有什么问题?

5 个答案:

答案 0 :(得分:66)

让我感到惊讶的是,没有人对此有正确答案。今天我面临完全相同的问题,谷歌没有帮助。

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

答案 1 :(得分:2)

简单答案 在您的crontab上,您需要指定USER来运行命令

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

0,10,20,30,40,50 * * * *根/ path_to_script / script_name

或以FRED用户身份运行

0,10,20,30,40,50 * * * *弗雷德/ path_to_script / script_name

未指定USER的默认值将以CRON用户身份运行,并且该用户无权执行脚本

答案 2 :(得分:1)

第六个位置是为运行作业的用户名保留的。您指定了一个名为sh的用户,该用户很可能不在计算机上。

答案 3 :(得分:0)

crontab文件没有任何问题(只要“my”crontab,你的意思是它是用户crontab而不是系统crontab;否则,see other answer)。

另一方面,系统的目录服务有问题 - 在Linux中配置为nsswitch.conf。也许您正在使用经过Kerberos身份验证的LDAP存储,并且您的cron守护程序没有Kerberos令牌可以连接到它(或者是沙箱,与SELinux一样,不具备网络访问权限);也许它是一个文件存储,正在运行crontab的用户无法读取;或许其他一些奇怪而有趣的事情正在发生。

getpwnam()是一个C库调用,用于查找当前登录用户的名称。如果你的shell是 bash ,那么它将回归到I have no name!的名称 - 所以这个错误意味着你的sh实现是不同的。 (如果您想使用bash运行脚本,请使用bash,而不是sh)。

答案 4 :(得分:0)

我们可以为系统也为个人创建cron作业。 /etc/crontab中的crontab专门用于系统cronjob。因此,您需要指定由谁执行的cronjob命令。在问题中,未指定用户名。因此,ERROR (getpwnam() failed)发生了。您可以在/var/spool/cron/username

中创建特定于用户的cronjobs

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