【问题标题】:Cron skipping over a portion of BASH scriptCron 跳过 BASH 脚本的一部分
【发布时间】:2013-04-27 05:31:04
【问题描述】:

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

【问题讨论】:

  • 哇!!谢谢,做到了。
  • @NCao - 添加您的评论作为答案,我会投赞成票

标签: bash cron


【解决方案1】:

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

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

PATH="$PATH:/usr/sbin"

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

【讨论】:

  • 或者您可以将其调用为/usr/sbin/zpool(假设它不会在$PATH 中调用需要/usr/sbin 的其他内容)。
  • 实际位置是/sbin/zpool 我刚刚编辑了调用它的三行以包含完整路径,它运行良好。现在开始学习如何通过电子邮件发送结果.....我肯定会很快回到这里;-)
猜你喜欢
  • 2013-10-26
  • 2018-12-08
  • 2018-08-23
  • 1970-01-01
  • 2023-03-06
  • 2016-10-01
  • 1970-01-01
  • 2022-01-17
  • 2013-11-26
相关资源
最近更新 更多