Linux crontab不会启动脚本

时间:2010-09-10 09:22:30

标签: bash shell cron crontab

我有这个用户crontab(通过命令crontab -e访问):

# m h  dom mon dow   command
*/3 * * * *          sh /home/FRAPS/Desktop/cronCheck.sh

脚本cronCheck.sh看起来像这样:

#!/bin/sh
SERVICE='Script'

if ps ax | grep -v grep | grep -i "$SERVICE" > /dev/null
then
    echo "######## $SERVICE service running, everything is fine ##################\n" >> CronReport.txt
else
    echo "$SERVICE is not running. Launching it now\n" >> CronReport.txt
    perl Script.pl 
fi

当我从自己的目录启动脚本(cronCheck.sh)时,它就像一个魅力,但是当cron启动时,它总是“#$ SERVICE service running,一切都很好###” 尽管'脚本'没有运行。

谢谢,

5 个答案:

答案 0 :(得分:2)

您需要将grep -v grep 放在 grep -i "$SERVICE"之后。你现在拥有它的方式是保证是真的。

答案 1 :(得分:2)

这是编写该条件的更好方法:

services=$(ps -e -o comm | grep -cFi "$SERVICE")
case "$services" in
    (0) 
        # restart service
    ;;
    (1)
        # everything is fine
    ;;
    (*)
        # more than one copy is running
    ;;
esac

通过使用ps -e -o comm,您可以避免执行愚蠢的grep -v grep事情,因为只有实际的进程名称出现在ps输出中,而不是参数。 grep -cFi计算匹配并给出一个数字,因此您不必处理管道的退出状态。

此外,正如其他海报所暗示的那样,您应该通过设置PATH变量来引导此脚本。

PATH=/bin:/usr/bin:/sbin:/usr/sbin
export PATH

您可能会或可能不想将/usr/local/bin放在该列表的开头,具体取决于您的系统。如果你不需要任何东西,不要这样做。

最后的建议:当编写将在没有用户监督的情况下执行的脚本(例如cron作业)时,最好将set -e放在开头。如果任何命令失败,这会使它们退出失败。

答案 2 :(得分:1)

检查管道的返回状态可能会有问题。你应该检查$ PIPESTATUS数组,或者你可以将最终的grep传递给wc -l来计算行数。

答案 3 :(得分:1)

cron通常不像用户帐户那样设置很多环境。您可能需要修改脚本以正确设置。

答案 4 :(得分:1)

Cron作业没有获得在shell提示符下获得的相同环境设置 - 这些设置通常由您的shell在登录时设置 - 因此您希望始终使用绝对路径而不是相对路径。 (即不要假设PATH环境变量将存在或设置为与shell提示符相同,并且不要假设脚本将在PWD设置到您的主目录时运行,等等)。所以:

    在您的crontab条目中
  • sh替换为/bin/sh(如果cronCheck.sh是可执行的,则将其删除,shebang行将执行此操作)。
  • 在cronCheck.sh中添加日志文件和perl脚本的路径。

cronCheck.sh最终会看起来像:

#!/bin/sh
SERVICE='Script'

if ps ax | grep -v grep | grep -i "$SERVICE" > /dev/null
then
    echo "######## $SERVICE service running, everything is fine ##################\n" >> CronReport.txt
else
    # Specify absolute path to a log file that's writeable for the user the
    # cron runs as (probably you). Example: /tmp/CronReport.txt
    echo "$SERVICE is not running. Launching it now\n" >> /tmp/CronReport.txt

    # Specify absolute path to both perl and the script. Example: /usr/bin/perl
    # and /home/FRAPS/scripts/Script.pl
    /usr/bin/perl /home/FRAPS/scripts/Script.pl 
fi

(如果Script.pl是可执行的,你可以摆脱/ usr / bin / perl位,并且在shebang行中有正确的perl路径。)

相关问题