通过systemd管理ZFS scrub

时间:2016-12-22 12:05:16

标签: ubuntu-16.04 systemd zfs

我想在ZFS服务器上自动执行zpool scrubbing。我已将以下systemd服务编写为/etc/systemd/system/zfs-scrub.service

[Unit]
Description=Scrub ZFS tank pool

[Service]
Type=simple
ExecStart=/bin/sh -c 'zpool scrub `zpool list -H -o name`'
RemainAfterExit=yes
ExecStop=/bin/sh -c 'zpool scrub -s `zpool list -H -o name`'

除了计时器(/etc/system.d/system/zfs-scrub.timer):

[Unit]
Description=Run zpool scrub every 1st Saturday

[Timer]
OnCalendar=Sat *-*-* 22:00:00

在几个星期前开始它后,我检查了它是否表现。似乎systemd仍然认为服务正在运行,因此计时器没有运行。

似乎没有ExecStatus,因此systemd不知道服务已完成。

  • 我错过了什么吗?我是否应该编写一个开始擦洗的脚本,grepping zpool状态行并捕获信号以在systemd发出信号时停止擦除?
  • 是否可以写一个OnCalendar行,表示“每月一次,仅在周末”?

1 个答案:

答案 0 :(得分:0)

要回答您的第二个问题,以下内容可以理解为每个月的前七天在午夜过后一分钟运行,但前提是该日也是星期日。因此,它应该在每个月的第一个星期日运行。

OnCalendar=Sun *-*-01..07 00:01:00

关于你的第一个问题,看看期刊的内容会有所帮助,而不仅仅是确认它是通过zpool status命令运行的。我注意到您的服务单元不需要zfs.target。我也会把服务打成一个" oneshot"而不是"简单"。

编辑:这应该适合你,虽然你需要为每个池启动/启用:

尝试使用zfs-scrub @ .service文件:

[Unit]
Description=Scrub ZFS tank pool

[Service]
Type=oneshot
ExecStart=/bin/zpool scrub %i

然后这是你的zfs-scrub @ .timer文件:

[Unit]
Description=Run zpool scrub every 1st Saturday

[Timer]
OnCalendar=Sun *-*-01..07 00:01:00 

然后,您将通过计时器启动服务:

systemctl start zfs-scrub@[pool name].timer
systemctl enable zfs-scrub@[pool name].timer