5

请考虑以下 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 执行:

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


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

4

3 回答 3

4

注释中所示,请在 crontab 脚本上使用完整路径,因为 crontab 确实具有与普通用户(在本例中为 root)不同的环境变量。

在你的情况下,而不是mdadm,/sbin/mdadm使它。

如何获取命令的完整路径?使用命令command -v

$ command -v rm
/bin/rm
于 2013-09-20T08:38:29.473 回答
3

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

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

于 2013-09-20T08:25:45.400 回答
2

在将脚本作为 cron 作业运行之前,您可以在没有环境变量的情况下使用env -i

env -i /var/maintenance/raid.sh
于 2019-06-02T01:06:43.967 回答