我在 OSMC 上将传输守护进程作为 systemd 服务运行。在重新启动后打开其远程控制 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
服务文件:
$ 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
系统状态:
$ 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
[...]
值得一提的是,我在每次重启后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
编辑:事实证明我的第一种方法没有按预期工作。覆盖文件上的一个
[Install]
部分实际上并不工作,并且RequiresMountsFor=
似乎只适用于在 fstab 中声明的挂载。因此,我提出了一个替代方案,它可以实现相同的效果,但使用不同的指令。为了防止单元在
/media/Elements
没有安装卷的情况下启动,请使用ConditionPathIsMountPoint=
将检查并阻止单元启动的指令,除非该目录已安装。(注意:您可以使用该
systemctl edit transmission.service
命令打开此覆盖文件的编辑器。)为了
transmission.service
在 USB 挂载时触发启动,您需要将符号链接添加到.wants/
挂载单元的目录。(理想情况下,这将由一个[Install]
部分来处理,但它似乎不适用于覆盖文件。)使用以下两个命令手动创建它:
就位后,安装
/media/Elements
并查看传输开始...下面的原始答案...
因此,该
After=
指令只影响排序,如果两个单元都排队等待启动,那么这个单元将在另一个完成后启动,但不会触发另一个单元的启动。你需要Requires=
那个。但是对于 mounts,有一个很好的快捷方式
RequiresMountsFor=
,可以将 mounts 作为路径。您可能还需要进行设置,以便在安装 USB 驱动器时启动该设备。您可以通过使用
WantedBy=
(在该[Install]
部分中)并从此处引用该.mount
单元来触发它。在设置好并使用systemctl enable
创建“通缉”关系后,该单元的启动将(也)在安装 USB 驱动器时触发(如果稍后完成,而不是在启动期间完成。)把它们放在一起:
然后启用这个单元,它将在
*.mount.wants/
目录下创建符号链接(确切的符号链接名称将打印在systemctl enable
输出中):这应该照顾它。
我不清楚您为什么要列出三个坐骑,因为在您建议的问题文本中仅
/media/Elements
用于存储传输下载...如果确实如此,您可能会删除其他两个并仅保留参考到“元素”之一。(注意:我在发布之前没有对这一切进行测试,但我相当有信心这会奏效。如果由于某种原因它不起作用,请给我留言并提供更多详细信息,我很高兴与您一起解决这出来了。)