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

Grz*_*cki 9 systemd systemd-timer

我即将将该rsync --delete目录 /mnt/foo 的服务写入远程服务器。但是,由于--delete选项的原因,除非挂载 /mnt/foo,否则我不想运行它,因为这可能会导致删除远程上的所有文件。

ConditionX(例如ConditionPathIsDirectory)和RequiresMountsFor=指令实现什么,有什么区别(每个的优缺点)?

草稿:这是我目前的草图:

RequiresMountsFor=/mnt/foo
Run Code Online (Sandbox Code Playgroud)

对比

# 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
Run Code Online (Sandbox Code Playgroud)

添加到.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
Run Code Online (Sandbox Code Playgroud)

为了正确起见,这里是.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
Run Code Online (Sandbox Code Playgroud)

小智 7

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

在启动一个单元之前,验证指定的条件是否为真。如果它不是真的,单元的开始将被跳过,但是它的所有排序依赖仍然被遵守。故障状态不会导致设备进入故障状态。在执行排队的启动作业时检查条件。

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

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