systemd.unit `RequiresMountsFor=` 与 `ConditionPathIsDirectory=`

systemd.unit `RequiresMountsFor=` 与 `ConditionPathIsDirectory=`

我即将将rsync --delete目录 /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

答案1

我也在寻找解释,最近的 Raspberry 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=

在启动设备之前,请验证指定的条件是否成立。如果不是 true,则将跳过单元的启动,但仍会遵守其所有排序依赖性。故障情况不会导致设备进入故障状态。在执行排队的启动作业时检查条件。

对于它的价值,我会选择ConditionPathIsMountPoint=

ConditionPathIsMountPoint=类似于ConditionPathExists=但验证某个路径是否存在并且是挂载点。

相关内容