Cron跳过一部分BASH脚本

时间:2013-04-26 20:11:48

标签: bash cron

我有一个位于/usr/local/bin/zfs_scrub.sh的BASH脚本。脚本的内容如下所示。 该脚本是可执行的,我可以以root身份运行它(sudo),它可以按预期执行。

我已编辑了根crontab sudo crontab -e并添加了以下行。 (10分钟是我的测试环境,实际上每周运行一次。)

*/10 * * * * /usr/local/bin/zfs_scrub.sh

当我手动运行脚本时,我按预期将6行写入日志

2013 04 26 14:19:17 :  
2013 04 26 14:19:17 : Starting ZFS Scrub
2013 04 26 14:19:17 : Starting Scrub on tankm
2013 04 26 14:19:17 : pool 'tankm' is healthy
2013 04 26 14:19:17 : Ending Scrub on tankm
2013 04 26 14:19:17 : Ending ZFS Scrub

当它由cron运行时,会发生以下情况

2013 04 26 15:50:02 :  
2013 04 26 15:50:02 : Starting ZFS Scrub
2013 04 26 15:50:02 : Ending ZFS Scrub

所以在我看来,cron要么跳过代码中的循环,要么在执行zpool list -H -o name时找不到zfs存储池。

任何意见都会受到赞赏。


zfs_scrub.sh

#!/bin/bash

LOG_FILE=/home/declan/log/zfs_scrub
LOG_LAST=/home/declan/log/zfs_scrub_last

LogEntry () {echo "$(date "+%Y %m %d %T") ; $1" >>$LOG_FILE 2>&1; }

while getopts ":n" opt; do
    case $opt in
    n)
        cp $LOG_FILE $LOG_LAST
        rm $LOG_FILE
        ;;
    \?)
        echo "Invalid option: -$OPTARG" >&2
        ;;
    esac
done

logEntry " "
LogEntry "Starting ZFS Scrub"

for POOL in $(zpool list -H -o name) ; do
    LogEntry "Starting Scrub on $POOL"
    zpool scrub $POOL 2>/dev/null
    LogEntry "$(zpool status -x $POOL 2>&1)"
    LogEntry "Ending Scrub on $POOL"
done

LogEntry "Ending ZFS Scrub"

1 个答案:

答案 0 :(得分:2)

cron通常不使用与您的shell完全相同的PATH,这解释了为什么cron运行的脚本找不到zpool可执行文件。

如果zpool是例如在/usr/sbin中,添加到脚本的开头:

PATH="$PATH:/usr/sbin"

或者,如果您只需要一个不依赖PATH本身的可执行文件,则只需使用其完整路径/usr/sbin/zpool