Управление очисткой ZFS через systemd

Я хотел бы автоматизировать очистку zpool на моем сервере ZFS. Я написал следующую службу 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 не знает, что служба завершена.

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

person tiennou    schedule 22.12.2016    source источник


Ответы (1)


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

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

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

РЕДАКТИРОВАТЬ: Это должно работать для вас, хотя вам нужно запустить/включить для каждого пула:

Попробуйте это для вашего файла [email protected]:

[Unit]
Description=Scrub ZFS tank pool

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

Затем это для вашего файла [email protected]:

[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
person airhuff    schedule 05.01.2017
comment
Я выбрал simple, а не oneshot, потому что zpool скраб не останется (он просто запускает скрабб и завершает работу). Дело в том, что нет текстовых отчетов, когда вы запускаете очистку (может быть, коды выхода, но я не проверял), кроме того, что время от времени grepping статус zpool для получения статуса/прогресса, и я не хотел писать обертку . - person tiennou; 06.02.2017
comment
Я понимаю что ты имеешь ввиду. Что бы это ни стоило, то, что я показал выше, в значительной степени является тем, что я использую как на своем сервере, так и на основной рабочей станции (хотя я изменил таймер, чтобы он соответствовал вашим требованиям). У меня проблем не было, хотя я не знаю как получить прогресс скраба кроме как через zpool status. - person airhuff; 11.02.2017