![每当安装/卸载设备时启动/停止用户单元](https://linux22.com/image/102590/%E6%AF%8F%E5%BD%93%E5%AE%89%E8%A3%85%2F%E5%8D%B8%E8%BD%BD%E8%AE%BE%E5%A4%87%E6%97%B6%E5%90%AF%E5%8A%A8%2F%E5%81%9C%E6%AD%A2%E7%94%A8%E6%88%B7%E5%8D%95%E5%85%83.png)
我将大部分最大的文件移至可移动磁盘,其中一些文件也是我想要播种的种子。我使用 deluged 作为我的 torrent 客户端,它是由 systemd 在我的用户上启动的。现在,驱动器可能会在启动时插入或稍后安装,这当然会导致 deluged 感到困惑并抱怨文件不匹配。最幼稚的解决方案是仅在安装设备后启动 deluged 服务,这就是我打算做的。
我见过这些答案 这表明使用RequiresMountsFor
and 根据systemctl --user show deluged
似乎可以做我想要的:
After=basic.target -.slice home.mount network-online.target media-braiam-AA64B45
RequiresMountsFor=/media/braiam/AA64B45A64B42AC9 /home/braiam
现在,如果我已经安装了设备,则可以启动该设备,但在卸载设备时它不会停止该设备,也不会在安装设备时启动该服务。
总之:
- 仅当设备已安装或可以安装时该服务才会启动
- 如果正在卸载设备,服务将停止
- 如果设备已安装,该服务将启动
- 如果服务停止,设备将保持安装状态。
这就是我已经做到的:
[Unit]
Description=Deluge Bittorrent Client Daemon
After=network-online.target
RequiresMountsFor=/media/braiam/id/
BindsTo=media-braiam-id.mount
目前,这会在卸载时停止服务,仅在可以安装安装点时启动并尝试安装设备。它不会挂载设备,因为只有 root 可以挂载它(我想如果我为系统安装一个单元,这将是可能的)。但是,如果安装点可用,它就不会启动。我如何实现我想要的?
答案1
您需要 BindsTo= 来一起启动和停止两个单元。但请记住 systemd 倾向于并行化。您还需要 After= 才能在启动服务之前完全激活挂载。它还具有相反的效果:必须完全停止服务才能取下安装。
[Unit]
Description=Deluge Bittorrent Client Daemon
After=network-online.target
BindsTo=media-braiam-id.mount
After=media-braiam-id.mount