ZFS清理完成后如何运行命令?


11

我想使用cron安排对ZFS池进行定期清理,并在清理完成后的相当短的时间内将状态报告通过电子邮件发送给我自己。这样做的目的是捕获任何问题,而无需手动查找它们(按而不是拉)。

第一部分很简单:只需设置一个cron作业即可zpool scrub $POOL在我的特定情况下以合理的时间间隔以root 身份运行。

第二部分,我不太确定该怎么做。zpool scrub立即返回,然后由系统在后台运行清理(如果清理是由管理员从终端启动的,这当然是理想的行为)。zpool status给我一个状态报告并退出(在运行Scrub时退出代码为0;它尚未完成,因此我不知道退出状态一旦完成是否会更改,但我对此表示怀疑)。zpool scrub记录的唯一参数是-s“ stop scrubbing”。

主要问题是检测从清洗完成清洗的状态变化。鉴于此,其余的应该归位。

理想情况下,我想告诉zpool scrub您在擦洗完成之前不要返回,但我看不出有任何办法可以做到这一点。(简单地进行cron几乎太容易了zpool scrub --wait-until-done $POOL; zpool status $POOL。)

如果失败,我想询问系统当前是否正在进行清理,最好采用不会因升级或配置更改而造成太大风险的方式,以便我可以对先前运行的设备进行操作清理已完成(通过在清理状态从清理变为未清理时执行zpool状态)。

这种特殊的设置是针对工作站系统的,因此,尽管诸如Nagios之类的监视工具可能具有可解决该问题的加载项,但仅为完成一项任务而安装这样的工具就显得有些过头了。有人可以建议采用较低技术含量的解决方案吗?

Answers:


13

ZFS上在Linux上,从0.6.3版开始,可以使用ZFS Event Daemon(zed)非常优雅地进行处理通过直接监视内核事件,事件守护程序几乎可以立即对发生的任何事件做出反应,并且不依赖于对其他命令输出的连续轮询和解析。

创建一个以任何以/etc/zfs/zed.d/scrub.finish(例如scrub.finish-custom.sh)开头的文件名的shell脚本。该脚本可以采取任何适当的措施,例如发送电子邮件,在某处写入日志条目或使系统唱歌和跳舞(好的,也许不是这样)。提供了可以提供起点的示例。

如果您只想在完成清理后收到一封电子邮件,提供的scrub.finish-email.sh脚本将可以很好地完成此任务。只需编辑/etc/zfs/zed.d/zed.rc即可指示将电子邮件发送到的位置以及是否在池中没有问题的情况下是否也应该发送电子邮件,请确保scrub.finish在/ etc中添加了名称后跟任何内容/zfs/zed.d导致它,并确保zed在启动时启动。



3

尽管此问题特定于Linux,但它是搜索“等到擦洗完成”时的第一个Google搜索结果,因此,我想为运行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等于所需的池名称。不过,它比轮询要少得多的开销。


2

我使用此简单脚本通过电子邮件清理状态报告。

如果您需要检测从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

我看了一下代码,但是看来它只为您提供脚本运行时的状态。当状态从“擦洗”变为“完成”时,它将如何通知我?
CVn 2013年

@MichaelKjörling由于正在while ... done检查这种情况的循环,只要正在进行清理,脚本就不会完成。
the-wabbit

我认为这样的事情是我要走的路。顺便说一句,grep -q应该在您的shell脚本代码片段中也能正常工作,而无需重定向到/ dev / null。:)
CVn

是的,我在缺少POSIX grep的Solaris 10上对其进行了测试。
dsmsk80 2013年

喔好吧。但是,GNU grep确实具有带有所需语义的-q。
CVn

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.