我有一个位于/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存储池。
任何意见都会受到赞赏。
#!/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"
答案 0 :(得分:2)
cron
通常不使用与您的shell完全相同的PATH
,这解释了为什么cron
运行的脚本找不到zpool
可执行文件。
如果zpool
是例如在/usr/sbin
中,添加到脚本的开头:
PATH="$PATH:/usr/sbin"
或者,如果您只需要一个不依赖PATH
本身的可执行文件,则只需使用其完整路径/usr/sbin/zpool
。