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

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

我正在编写一个systemd .service应该开始的脚本/etc/fstabCIFS 网络位置通过/mnt/启动时安装。

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

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

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

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

答案1

/etc/fstabCIFS 网络位置通过/mnt/启动时安装。

不它不是。把这件事做好,剩下的就自然而然了。

挂载由(生成的)systemd 处理安装单元它将被命名为类似mnt-wibble.mount.您可以在以下命令的输出中看到它的实际名称:

systemctl list-units --type=mount

您可以像任何其他单元一样详细查看它:

systemctl status

非常简单:您必须命令在安装单元启动后启动您的单元。

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

进一步阅读

答案2

尽管两个答案都是正确的,但我想在讨论中添加我的两分钱,因为当我寻找它时,我缺少一些如何继续的说明和示例。

  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

注意:您可能需要添加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

不要忘记启用该服务,以便它在启动时启动:systemctl enable my-daemon

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

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

更新(2019-06-25):

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

答案3

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

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

RequiresMountsFor=/绝对/路径/of/安装

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

答案4

@bm-bergmotte:感谢您的指导,对我帮助很大。对我来说,它只是工作,如果我把

After=network.target vpn-launch.service mnt-cifs.mount
Requires=vpn-launch.service mnt-cifs.mount

如果我没有将“mnt-cifs.mount”放在“Requires”中(并按此顺序),它可以重新启动/启动,但如果设备未安装,服务仍然会启动。如果未安装设备,则将其另外放入“需要”后,服务会在启动之前安装设备。

相关内容