And*_*rew 22 shell cron crontab sh
这是我的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
Run Code Online (Sandbox Code Playgroud)
这是在/var/log/cron
尝试运行时不断显示的错误:
crond[669]: (sh) ERROR (getpwnam() failed)
Run Code Online (Sandbox Code Playgroud)
如果我手动运行任何这些文件,它们的工作没有任何问题.
crontab文件有什么问题?
het*_*kel 77
让我感到惊讶的是,没有人能够正确回答这个问题.今天我面临完全相同的问题,谷歌没有帮助.
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
Run Code Online (Sandbox Code Playgroud)
所以它包含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
Run Code Online (Sandbox Code Playgroud)
这在man crontab(5)中有记载.例如https://linux.die.net/man/5/crontab.它说:
工作在/etc/cron.d/
cron.d中的作业是系统作业,通常用于多个用户.这就是为什么需要用户名称的原因.第一行的MAILTO是可选的.
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
)。