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 

  • Запуск пользовательского таймера systemd, когда у них нет открытого сеанса
  • Как узнать, какая команда выполняется файлом systemd .timer?
  • Как настроить Systemd Timer для запуска службы в последний день месяца
  • Таймер Systemd, срок действия которого истек
  • Поручить выполнить блок после успешного завершения работы другого устройства
  • Периодически выполняемый btrfs-scrub
  • Есть ли способ узнать, когда будет запускаться системный таймер?
  • systemd запустить блок на успех другого
  • 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= но проверяет, существует ли определенный путь и является точкой монтирования.

    Linux и Unix - лучшая ОС в мире.