2016-12-22 10 views
2

Я хотел бы автоматизировать очистку zpool на моем ZFS-сервере. Я написал следующую Systemd службу в качестве /etc/systemd/system/zfs-scrub.service)Управление сглаживанием ZFS через systemd

[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 не знает, что сервис завершен.

  • Я что-то пропустил? Должен ли я вместо этого писать сценарий, запускающий скраб, greps строка состояния zpool и сигналы catch, чтобы остановить скраб, когда systemd сигнализирует об этом?
  • Можно ли написать строку OnCalendar, что означает «один раз в месяц, только по выходным»?

ответ

0

Чтобы ответить на ваш второй вопрос, можно прочесть следующие данные за первые семь дней каждого месяца за минуту до полуночи, но только если этот день также является воскресенью. Таким образом, он должен запускать первое воскресенье каждого месяца.

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

Что касается первого вопроса, то было бы полезно, чтобы увидеть, что говорит журнал, а не только подтвердив, что бежал с помощью команды zpool статус. Я заметил, что ваш сервисный модуль не требует zfs.target. Также я бы сделал сервис Type «onehot», а не «простой».

EDIT: Это должно работать для вас, но вам нужно начать/включить для каждого пула:

Попробуйте для ZFS-скраб @ .Service файла:

[Unit] 
Description=Scrub ZFS tank pool 

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

Тогда это для вашего ZFS-скраб @ .timer файл:

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

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

Вы бы затем запустить службу с помощью таймера с:

systemctl start [email protected][pool name].timer 
systemctl enable [email protected][pool name].timer 
+0

Я выбрал 'simple' over' oneshot', потому что zpool scrub не останется вокруг (он просто запускает очистку и выходы). Дело в том, что нет текстовой отчетности, когда вы запускаете scrub (возможно, коды выхода, но я не проверял), кроме времени grepping zpool, чтобы получить статус/прогресс, и я не хотел писать обертку , – tiennou

+0

Я понимаю, что вы имеете в виду. Для чего это стоит, то, что я показал выше, в значительной степени использует то, что я использую как на моем сервере, так и на основной рабочей станции (хотя я модифицировал таймер в соответствии с вашими требованиями). У меня не было проблем, хотя я не знаю, как получить прохождение скраба, кроме как через 'zpool status'. – airhuff