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 .timer?
  • системный таймер каждые 2 часа через 30 минут после часа?
  • Ошибка анализа на блоке таймера systemd. Неверная документация?
  • Каков правильный способ отключения блока таймера systemd?
  • Периодически выполняемый btrfs-scrub
  • systemd: изящно сбой резервного копирования, когда внешний диск не подключен
  • Запуск пользовательского таймера systemd, когда у них нет открытого сеанса
  • 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 - лучшая ОС в мире.