2

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

我已经编辑了根 crontabsudo 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 要么跳过了代码中的循环,要么在执行时没有找到 zfs 存储池zpool list -H -o name

任何输入将不胜感激。


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"
4

1 回答 1

2

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

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

PATH="$PATH:/usr/sbin"

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

于 2013-04-26T20:46:07.837 回答