如何在ZFS scrub *完成后运行命令*?

我想使用cron来安排我的ZFS池的定期擦洗,并且在擦洗结束后的相当短的时间 ,给我自己发送状态报告。 这样做的目的是捕捉任何问题,而不必手动查找它们(推而不是拉)。

第一部分很简单:只要设置一个cron作业,以任意间隔运行zpool scrub $POOL作为根,在我的特殊情况下是合理的。

第二部分,我不太确定如何去做。 zpool scrub立即返回,然后由系统在后台运行清理(如果清理是由pipe理员从terminal启动的话,这当然是可取的行为)。 zpool status为我提供了一个状态报告并退出(退出代码为0,当擦洗正在运行时,它还没有完成,所以我不知道退出状态是否改变,但我怀疑它)。 为zpool scrublogging的唯一参数是-s “stop scrubbing”。

主要的问题是检测从洗涤成品洗涤的状态变化。 鉴于此,其余的应该落实到位。

理想情况下,我想告诉zpool scrub直到擦洗结束才能返回,但是我看不出有什么办法可以做到这一点。 (这会让简单的cron zpool scrub --wait-until-done $POOL; zpool status $POOL简单zpool scrub --wait-until-done $POOL; zpool status $POOL 。)

如果不这样做,我想询问系统是否正在进行清理,最好以不会因升级或configuration更改而冒险的方式,以便我可以根据是否以前运行擦洗已经完成(当擦洗状态从擦洗转为不擦洗时,通过执行一个zpool状态)。

这个特殊的设置是针对一个工作站系统的,所以像Nagios这样的监控工具可能有解决问题的插件,安装这样一个工具只是为了完成这个任务,实际上是相当矫枉过正的。 有人可以build议一个较低的技术解决scheme的问题?

  • 从ZFS中有效地删除10M +文件
  • VMware ESXi和ZFS硬件和configurationbuild议
  • 是否有可能在Hotswap上自动恢复ZFSarrays
  • ESXi主机上其他虚拟机的虚拟化存储
  • 减less离线备份的ZFSstream大小
  • 单个设备上的zfs:文件损坏时会发生什么?
  • 4 Solutions collect form web for “如何在ZFS scrub *完成后运行命令*?”

    在ZFS上在Linux上 ,从版本0.6.3开始,可以通过使用ZFS事件守护进程(zed)进行相当优雅的处理 通过直接监视内核事件,事件守护进程可以立即对发生的任何事件作出反应,而不依赖于连续轮询和parsing某个其他命令的输出。

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

    如果你想要的只是在scrub.finish-email.sh完成时收到一封邮件,那么提供的scrub.finish-email.sh脚本就可以很好地完成。 只需编辑/etc/zfs/zed.d/zed.rc以指示电子邮件应该发送到哪里以及是否也应该发送电子邮件,如果池没有遇到任何问题,请确保命名为scrub.finish其后是任何内容在/etc/zfs/zed.d导致它,并确保zed启动时启动。

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

    • zpadmin

    如果你需要检测从scrub runningscrub finished转换,我将检查zpool status输出的state字段。 像这样的东西:

     # 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 

    虽然这个问题是特定于Linux,这是search“等到擦洗完成”的第一个谷歌结果,因此我想为运行OpenSolaris的人添加一些有用的信息(在OmniOS上testing它,但SmartOS,Illumos等应该是类似的)而不是Linux(正常的Solaris也应该可以,但是我没有在那里testing)。

    您可以使用syseventadm来注册内核事件。 完整的列表可以在/usr/include/sys/sysevent/eventdefs.hfind(只要在这个文件中search“ZFS”)。 添加事件后,服务必须重新启动,例如:

     syseventadm add -c EC_zfs -s ESC_ZFS_scrub_finish /path/to/script.sh \$pool_name syseventadm restart 

    这样,脚本将在任何池的任何清理完成时启动 – 如果$1等于您想要的池名称,则必须检查脚本内部。 尽pipe如此,它比投票还要less得多。

    我已经与zfswatcher取得了很大的成功

    服务器问题集锦,包括 Linux(Ubuntu, Centos,Debian等)和Windows Server服务器.