当由Bash执行而不是由cron执行时,脚本会产生不同的结果

时间:2013-09-20 08:22:48

标签: linux bash shell cron

请考虑关注crontab(root):

SHELL=/bin/bash
...
...
0 */3 * * * /var/maintenance/raid.sh

bash脚本/var/maintenance/raid.sh

#!/bin/bash

echo -n "Checking /dev/md0... "
if ! [ $(mdadm --detail /dev/md0 | grep -c "active sync") -eq 2 ]; then
    mdadm --detail /dev/md0 | mail -s "Raid problem /dev/md0" "my@email.com";
    echo "ERROR"
else 
    echo "ALL OK"
fi;

#-------------------------------------------------------

echo -n "Checking /dev/md1... "
...

这就是......

时发生的事情

...从shell提示符(bash)执行:

带有mdadm --detail /dev/md0输出的邮件会发送到我的电子邮件(正确行为)

...由cron执行:

空白邮件会发送到我的电子邮件(主题在那里,但没有消息)


为什么会出现这种差异以及如何解决?

3 个答案:

答案 0 :(得分:4)

如上所述in the comments,请在crontab脚本上使用完整路径,因为crontab的环境变量与普通用户不同(在本例中为root)。

在您的情况下,mdadm取代/sbin/mdadm,而不是command -v

如何获得full path of a command?使用命令$ command -v rm /bin/rm

{{1}}

答案 1 :(得分:3)

cron任务在shell中运行,该shell在没有运行登录脚本的情况下启动,这将设置路径,环境变量等。

在构建cron任务时,更喜欢绝对路径和显式选项等等

答案 2 :(得分:0)

在将脚本作为cron作业运行之前,可以使用env -i

在没有环境变量的情况下对其进行测试
env -i /var/maintenance/raid.sh