每当安装/卸载设备时启动/停止用户单元

每当安装/卸载设备时启动/停止用户单元

我将大部分最大的文件移至可移动磁盘,其中一些文件也是我想要播种的种子。我使用 deluged 作为我的 torrent 客户端,它是由 systemd 在我的用户上启动的。现在,驱动器可能会在启动时插入或稍后安装,这当然会导致 deluged 感到困惑并抱怨文件不匹配。最幼稚的解决方案是仅在安装设备后启动 deluged 服务,这就是我打算做的。

我见过这些答案 这表明使用RequiresMountsForand 根据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

关于堆栈溢出的类似问题: https://stackoverflow.com/questions/48687099/filesystem-are-unmounted-before-the-services-are-stopped-in-systemd/52882065#52882065

相关内容