设置 systemd 服务在 fstab 挂载后执行

P A*_*A N 68 debian systemd

我工作的一个systemd .service是应该启动脚本后CIFS网络位置通过安装/etc/fstab于/mnt/在启动时。

该脚本首先等待 OpenVPN 依赖脚本启动,但我也希望它等待挂载完成。

/etc/systemd/system/my-daemon.service:

[Unit]
Description=Launch My Daemon
After=network.target vpn-launch.service
Requires=vpn-launch.service
Run Code Online (Sandbox Code Playgroud)

我试图添加systemd.mount到行:After=network.target vpn-launch.service systemd.mount,但它没有给出我希望的结果。

Jde*_*eBP 98

CIFS网络位置经由安装/etc/fstab于/mnt/在启动时。

不它不是。做对了,其余的自然而然地就位。

挂载由(生成的)systemd挂载单元处理,该单元将命名为mnt-wibble.mount. 您可以在systemctl list-units --type=mount命令的输出中看到它的实际名称。您可以像使用systemctl status.

那么很简单:您必须在安装单元启动后订购您的单元。

After=network.target vpn-launch.service mnt-wibble.mount

进一步阅读

  • 使用“systemctl list-units --type=mount”列出挂载 (18认同)
  • 对于追随者来说,“wibble”只是一个虚拟名称,就像“foobar” (4认同)
  • 在答案中使用类似`mnt-[disk name].mount`而不是`mnt-wibble.mount`这样的东西不是更好,这样用户就不会输入那个确切的名称吗? (3认同)

bm-*_*tte 26

虽然这两个答案都是正确的,但我想在讨论中加上我的两分钱,因为当我寻找它时,我遗漏了一些如何进行的说明和示例。

  1. 将文件系统添加到 /etc/fstab
  2. mount -a挂载 fstab 中提到的所有文件系统的类型
  3. 查找已生成的 systemd 单元:(

    systemctl list-units | grep '/path/to/mount' | awk '{ print $1 }'

    应返回以 结尾的内容.mount)
  4. 将找到的 mount-unit 添加到文件中 的After=语句中*.service

以下是my-daemon在启动时启动服务的示例,但在网络准备就绪后,CIFS 共享安装在/mnt/cifs,并且vpn-launch服务已启动:

/etc/fstab

//servername/sharename /mnt/cifs cifs defaults,some,other,options 0 0
Run Code Online (Sandbox Code Playgroud)

注意:您可能想要添加nofail到您的 fstab 选项(例如,当使用外部驱动器时)。否则,如果设备未连接,您的机器将无法启动。参见ArchWiki 的 fstab 文章


/etc/systemd/system/my-daemon.service

[Unit]
Description=Launch My Daemon
Requires=vpn-launch.service mnt-cifs.mount
After=network.target vpn-launch.service mnt-cifs.mount

[Service]
ExecStart=/path/to/my-daemon

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

不要忘记启用该服务,使其在启动时启动: systemctl enable my-daemon

请注意,这也适用于其他文件系统(NFS、HDD 等)。

如前所述,两个答案都是正确的,我鼓励每个人都阅读它们,但对我来说,举几个例子可以节省我一些时间。

更新(2019-06-25):

  • 添加了关于 fstab 选项的注释,以防止在使用外部驱动器时锁定引导
  • 添加mnt-cifs.mount到Requires=列表中导致my-daemon.servicecifs挂载未成功导致无法启动


小智 22

抱歉,我还不能发表评论。

就像 JdeBP 所说的,你应该在文件系统挂载上进行排序。您可以预测安装单元的名称,或者,您可以使用(在单元部分):

RequiresMountsFor=/absolute/path/of/mount

此选项创建对适当 *.mount 单元的依赖关系,以便在启动服务之前使路径可访问。它可能不是在所有 systemd 版本上都有,但我在过去 6 个月左右的时间里一直在 CentOS 7 机器上使用它。