等到 USB 驱动器安装后才启动传输守护程序?

And*_*eas 8 automounting usb-drive systemd services transmission

我在 OSMC 上将传输守护程序作为系统服务运行。在重新启动后打开其远程控制 Web 界面时,所有传输几乎总是停止并显示消息“错误:未找到数据!确保您的驱动器已连接 [...]”。

我假设这是因为传输在下载路径存在之前开始 - 在这种情况下,在系统自动安装的 USB 驱动器上,/media/Elements/[...]无需我进行任何手动配置。我没有编辑过fstab

尝试了这个答案但没有成功之后,我想知道是否还有其他方法可以解决这个问题?我根据那个答案所做的是在一个中添加以下内容override.conf

cat /etc/systemd/system/transmission.service.d/override.conf

[Unit]
After=media-Elements.mount
After=media-Vault\x2013.mount
After=media-Black\x20Mesa.mount
Run Code Online (Sandbox Code Playgroud)

服务文件:

$ cat /lib/systemd/system/transmission.service

[Unit]
Description=Transmission BitTorrent Daemon
After=udisks-glue.service

[Service]
User=osmc
Group=osmc
Type=notify
ExecStartPre=/bin/sleep 10
ExecStart=/usr/bin/transmission-daemon -f --log-error --allowed *.*.*.*

[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)

系统状态:

$ systemctl status transmission

? transmission.service - Transmission BitTorrent Daemon
   Loaded: loaded (/lib/systemd/system/transmission.service; enabled; vendor preset: enabled)
  Drop-In: /etc/systemd/system/transmission.service.d
           ??override.conf
[...]
Run Code Online (Sandbox Code Playgroud)

值得一提的是,我在每次重启后Warning: transmission.service changed on disk. Run 'systemctl daemon-reload' to reload units.检查状态时transmission都会得到。daemon-reload使其静音,直到下一次重新启动。

这个问题是相关的,但与 fstab 挂载有关。如果可能,我更愿意在没有 fstab 的情况下解决它,因为我不想将 USB 驱动器视为永久连接。


尝试最初的答案后:

$ systemctl cat --no-pager transmission.service
# Warning: transmission.service changed on disk, the version systemd has loaded is outdated.
# This output shows the current version of the unit's original fragment and drop-in files.
# If fragments or drop-ins were added or removed, they are not properly reflected in this output.
# Run 'systemctl daemon-reload' to reload units.
# /lib/systemd/system/transmission.service
[Unit]
Description=Transmission BitTorrent Daemon
After=udisks-glue.service

[Service]
User=osmc
Group=osmc
Type=notify
ExecStartPre=/bin/sleep 10
ExecStart=/usr/bin/transmission-daemon -f --log-error --allowed *.*.*.*

[Install]
WantedBy=multi-user.target

# /etc/systemd/system/transmission.service.d/override.conf

[Unit]
RequiresMountsFor=/media/Elements

[Install]
WantedBy=media-Elements.mount
Run Code Online (Sandbox Code Playgroud)

fil*_*den 11

编辑:事实证明我的第一种方法没有按预期工作。在[Install]上覆盖文件部分并未真正发挥作用,并RequiresMountsFor=似乎只工作这是在fstab中声明的坐骑。因此,我提出了一种替代方案,可以实现相同的效果,但使用不同的指令。

为了防止单元在/media/Elements未挂载卷的情况下启动,请使用ConditionPathIsMountPoint=将检查并防止单元在未挂载该目录的情况下启动的指令。

# /etc/systemd/system/transmission.service.d/override.conf

[Unit]
ConditionPathIsMountPoint=/media/Elements
Run Code Online (Sandbox Code Playgroud)

(注意:您可以使用该systemctl edit transmission.service命令在此覆盖文件上打开编辑器。)

为了transmission.service在 USB 挂载时触发启动,您需要将符号链接添加到.wants/挂载单元的目录中。(理想情况下,这将由一个[Install]部分处理,但它似乎不适用于覆盖文件。)

使用以下两个命令手动创建它:

$ sudo mkdir -p /etc/systemd/system/media-Elements.mount.wants/
$ sudo ln -sf /lib/systemd/system/transmission.service /etc/systemd/system/media-Elements.mount.wants/
Run Code Online (Sandbox Code Playgroud)

到位后,安装/media/Elements并查看传输开始...


原答案如下...

所以,该After=指令只影响排序,如果两个单元都在排队等待启动,那么这个将在另一个完成后启动,但不会触发另一个的启动。你需Requires=要这样做。

但是对于坐骑, 中有一个很好的快捷方式RequiresMountsFor=,可以将坐骑作为路径。

您可能还想设置它以便在安装 USB 驱动器时启动本机。您可以通过使用WantedBy=(在[Install]部分中)并.mount从此处引用该单元来触发它。在设置并systemctl enable用于创建“Wanted”关系后,该单元的启动将(也)在 USB 驱动器安装时触发(如果稍后完成而不是在启动期间)。

把它们放在一起:

# /etc/systemd/system/transmission.service.d/override.conf

[Unit]
RequiresMountsFor=/media/Elements "/media/Vault 13" "/media/Black Mesa"

[Install]
WantedBy=media-Elements.mount
WantedBy=media-Vault\x2013.mount
WantedBy=media-Black\x20Mesa.mount
Run Code Online (Sandbox Code Playgroud)

然后启用此单元,它将在*.mount.wants/目录下创建符号链接(确切的符号链接名称将打印在systemctl enable输出中):

# systemctl enable transmission.service
Run Code Online (Sandbox Code Playgroud)

这应该照顾它。

我不清楚你为什么要列出这三个坐骑,因为在你建议的问题文本中只/media/Elements用于存储传输下载......如果确实如此,你可能会删除另外两个并只保留参考到“元素”之一。

注意:我在发布之前还没有测试过这一切,但我相当有信心这会起作用。如果由于某种原因它不起作用,请给我留下更多详细信息的评论,我很高兴与您合作来计算这个出来。)