我有一个 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"