![ZFS 清理完成之后如何运行命令?](https://linux22.com/image/617912/ZFS%20%E6%B8%85%E7%90%86%E5%AE%8C%E6%88%90%E4%B9%8B%E5%90%8E%E5%A6%82%E4%BD%95%E8%BF%90%E8%A1%8C%E5%91%BD%E4%BB%A4%EF%BC%9F.png)
我想使用 cron 来安排定期清理我的 ZFS 池,并在某个合理的短时间内磨砂完成后,通过电子邮件向自己发送状态报告。这样做的目的是无需手动查找(推送而不是拉取)即可发现任何问题。
第一部分很简单:只需设置一个 cron 作业,以zpool scrub $POOL
在我的特定情况下合理的时间间隔以 root 身份运行。
第二部分,我不太清楚该怎么做。zpool scrub
立即返回,然后系统在后台运行清理(如果清理是由管理员从终端启动的,这当然是可取的行为)。zpool status
给我一个状态报告并退出(清理运行时退出代码为 0;它还没有完成,所以我不知道完成后退出状态是否会改变,但我对此表示怀疑)。zpool scrub 记录的唯一参数是-s
“停止清理”。
主要问题是检测状态的变化擦洗到擦洗完毕。有了这个,其余的事情就水到渠成了。
理想情况下,我希望告诉zpool scrub
它不要返回,直到清理完成,但我看不出有任何方法可以做到这一点。(这几乎使简单的 cron 变得太容易了zpool scrub --wait-until-done $POOL; zpool status $POOL
。)
除此之外,我想询问系统是否正在进行清理,最好以一种不会因升级或配置更改而产生太大风险的方式,以便我可以根据先前运行的清理是否已完成采取行动(通过在清理状态从清理变为非清理时执行 zpool status)。
此特定设置适用于工作站系统,因此虽然 Nagios 等监控工具大概有可以解决问题的插件,但为了这一项任务而安装这样的工具感觉有点小题大做。有人能建议一种技术含量较低的解决方案来解决这个问题吗?
答案1
在Linux 上的 ZFS, 从...开始版本 0.6.3这可以通过使用ZFS 事件守护进程(zed)。事件守护进程通过直接监视内核事件,可以对发生的任何事件几乎立即做出反应,而不依赖于对其他命令输出的连续轮询和解析。
创建一个以 开头的任意文件名的 shell 脚本/etc/zfs/zed.d/scrub.finish
(例如scrub.finish-custom.sh
)。该脚本可以执行任何适当的操作,例如发送电子邮件、在某处写入日志条目或让系统唱歌跳舞(好吧,也许不是那样)。提供的示例可以提供起点。
如果您只想在清理完成后收到一封电子邮件,那么提供的scrub.finish-email.sh
脚本可以很好地完成这一任务。只需编辑 /etc/zfs/zed.d/zed.rc 以指示应将电子邮件发送到何处以及如果池没有遇到任何问题是否也应发送电子邮件,确保 /etc/zfs/zed.dscrub.finish
中后跟任何内容的命名指向它,并确保 zed 在启动时启动。
答案2
虽然这个问题是针对 Linux 的,但它是搜索“等待擦洗完成”因此我想为运行 OpenSolaris(在 OmniOS 上测试过,但 SmartOS、illumos 等应该类似)而不是 Linux(普通 Solaris 也应该可以工作,但我没有在那里测试过)的人添加一些有用的信息。
您可以使用syseventadm
它来注册内核事件。完整列表可以在/usr/include/sys/sysevent/eventdefs.h
(只需在此文件中搜索“ZFS”即可)中找到。添加事件后,必须重新启动服务,例如:
syseventadm add -c EC_zfs -s ESC_ZFS_scrub_finish /path/to/script.sh \$pool_name
syseventadm restart
这样,当任何池的清理完成时,脚本就会启动 - 您必须在脚本内部检查它是否$1
等于您想要的池名称。不过,它比轮询的开销要小得多。
答案3
我使用这个简单的脚本来通过电子邮件清理状态报告。
如果你需要检测从 到scrub running
的转换,scrub finished
我会检查 输出state
字段zpool status
。像这样:
# start scrubbing
zpool scrub ZPOOL
# wait till scrub is finished
while zpool status ZPOOL | grep 'scan: *scrub in progress' > /dev/null; do
echo -n '.'
sleep 10
done
# send a report
zpool status | mail -s "zpool status: ZPOOL" RECIPIENT
答案4
最近的 ZFS 版本准确地添加了 OP 所要求的内容:用于-w
等待清理完成后再返回。例如:
zpool scrub tank -w ; zpool status tank | mail -s "report" [email protected]