systemd.unit `RequiresMountsFor =` vs `ConditionPathIsDirectory =`

Я собираюсь написать службу rsync --delete directory / mnt / foo для удаленного сервера. Однако из-за опции --delete я бы не запускал ее, если / mnt / foo не смонтирован, так как это может привести к удалению всех файлов на удаленном компьютере.

Что нужно сделать с помощью ConditionX (например, ConditionPathIsDirectory ) и RequiresMountsFor= директивы, и в чем разница (плюсы и минусы каждого)?

Черновик: Вот мой текущий эскиз:

 RequiresMountsFor=/mnt/foo 

против

 # assuming there is `bar_only_on_foo` subdirectory on monted directory, which does not exis on unmounted one. ConditionPathIsDirectory=/mnt/foo/bar_only_on_foo 

Чтобы добавить файл .service :

 # /etc/systemd/system/rsync_to_remotey.service # or : /home/$USER/.config/systemd/user/rsync_to_remotey.service [Unit] Description=rsync USER X data to REMOTE Y [Service] Type=simple ExecStart=/home/USERX/rsync_userx_to_remotey.sh 

Для правильности, вот .timer файл:

 # /etc/systemd/system/rsync_to_remotey.timer # or : /home/$USER/.config/systemd/user/rsync_to_remotey.timer [Unit] Description=Runs every 30 minutes rsync USER X data to REMOTE Y [Timer] OnBootSec=30min AccuracySec=1h OnCalendar=*:0/30 Unit=rsync_to_remotey.service [Install] WantedBy=multi-user.target 

One Solution collect form web for “systemd.unit `RequiresMountsFor =` vs `ConditionPathIsDirectory =`”

Я также искал объяснения, и man-страницы на недавнем изображении малины Pi Jessie дали мне один.

Сначала я посмотрел: man 7 systemd который затем заставлял меня смотреть: man 5 systemd.unit

который предусматривал следующее:

RequiresMountsFor=

Получает список абсолютных путей, разделенных пробелами. Автоматически добавляет зависимости типа Requires= и After= для всех блоков монтирования, необходимых для доступа к указанному пути.

Точки монтирования, отмеченные noauto, не устанавливаются автоматически и будут игнорироваться для целей этой опции. Если такое гнездо должно быть требованием для данного устройства, могут быть добавлены прямые зависимости от монтируемых блоков ( Requires= и After= или некоторая другая комбинация).

Немного дальше на странице руководства,

ConditionArchitecture= , ConditionVirtualization= , ConditionHost= , ConditionKernelCommandLine= , ConditionSecurity= , ConditionCapability= , ConditionACPower= , ConditionNeedsUpdate= , ConditionPathExists= , ConditionPathExistsGlob= , ConditionPathIsDirectory= , ConditionPathIsSymbolicLink= , ConditionPathIsMountPoint= , ConditionPathIsReadWrite= , ConditionDirectoryNotEmpty= , ConditionFileNotEmpty= , ConditionFileIsExecutable= , ConditionNull=

Перед запуском устройства убедитесь, что указанное условие истинно. Если это неверно, запуск устройства будет пропущен, однако все его заказы по-прежнему соблюдаются. Неудачное состояние не приведет к переходу устройства в состояние отказа. Условие проверяется в то время, когда должно выполняться задание запуска в очередь.

Для чего это стоит, я иду с ConditionPathIsMountPoint= :

ConditionPathIsMountPoint= аналогичен ConditionPathExists= но проверяет, существует ли определенный путь и является точкой монтирования.

  • Ошибка анализа на блоке таймера systemd. Неверная документация?
  • systemd: Как выполнять задание как периодически, так и один раз при завершении работы системы?
  • Периодически выполняемый btrfs-scrub
  • Как настроить Systemd Timer для запуска службы в последний день месяца
  • «Systemctl list-timers» показывает последние выполненные даты, которые далеки в будущем
  • Как узнать, какая команда выполняется файлом systemd .timer?
  • Linux и Unix - лучшая ОС в мире.