shell 仅当从cron调用时,/bin/sh中的“getLognam()失败”

gpnt7bae  于 2023-10-23  发布在  Shell
关注(0)|答案(6)|浏览(125)

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

piwo6bdm

piwo6bdm1#

令我惊讶的是,没有人知道这个问题的正确答案。今天我遇到了同样的问题,谷歌没有帮助。
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是可选的。

uqjltbpv

uqjltbpv2#

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

gojuced7

gojuced73#

在crontab上的一个简单的答案,你需要指定用户来运行命令
以ROOT身份运行的示例是:
0,10,20,30,40,50 * 根/路径到脚本/脚本名称
或以用户FRED身份运行
0,10,20,30,40,50 * fred /path_to_script/script_name
如果未指定USER,则默认情况下将以用户CRON身份运行,并且该用户没有执行脚本的权限

2eafrhcq

2eafrhcq4#

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

注意:Cron作业非常有用,但失败时会造成灾难性的后果!

bprjcwpo

bprjcwpo5#

crontab文件没有任何问题(只要“我的”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)。

oug3syen

oug3syen6#

如果有人偶然发现这个:
我也遇到过类似的问题。我的错误消息是:
(root)ERROR(getError()failed)
解决方案是删除crontabs行中用户名root周围的所有空格。我只在一台机器上遇到过这个问题,到目前为止,在其他机器上有更多空格的同一行工作正常.

相关问题