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


33

我工作的一个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

我试图添加systemd.mount到这一行:After=network.target vpn-launch.service systemd.mount,但是没有给出我想要的结果。


如果您将其添加systemd-remount-fsAfter列表中,是否可行?
Eric Renouf 2015年

Answers:


40

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

不它不是。做到这一点,其余的自然就位。

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

然后,非常简单:您必须订购要在该安装单元启动后启动的单元。

之后= network.target vpn-launch.service mnt-wibble.mount

进一步阅读


10
使用“ systemctl list-units --type = mount”安装列表
nijave

对于追随者来说,“摆动”只是一个虚拟名称,例如“ foobar”
rogerdpack

17

抱歉,我无法发表评论。

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

RequiresMountsFor = /绝对/路径/安装数量

此选项在启动服务之前创建对相应* .mount单元的依赖关系,以使路径可访问。它可能并非在所有systemd版本上都适用,但最近6个月左右的时间我一直在CentOS 7计算机上使用它。


(这里有您与vanilla systemd的区别。) RequiresMountsFor=确实带有一些警告。有了RedHat错误#1088057Chris Siebenmann,您应该能够回答superuser.com/questions/988734。这个问题也是CIFS挂载。但这意味着auto,幸运的是。
JdeBP 2015年

@JdeBP谢谢您的评论。我不了解该功能的注意事项和问题。
miguelbernadi 2015年

14

尽管两个答案都是正确的,但是我想在讨论中加上两分钱,因为当我寻找它时,我错过了一些说明和示例。

  1. 将文件系统添加到 /etc/fstab
  2. mount -a挂载fstab中提到的所有文件系统的类型
  3. 查找使用以下命令生成的systemd单元

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

    (应返回以结尾的内容.mount
  4. 将找到的安装单元添加到文件中 的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.service未成功安装CIF挂载时导致启动失败

只需清楚一点,“ mnt-cifs.mount”是您的特定安装点的安装单元的名称,始于systemctl list-units --type=mount
smdvlpr

1

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

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

如果我未将“ mnt-cifs.mount”放在“ Requires”(按此顺序)内,则可以重新启动/启动,但如果未安装设备,该服务仍会启动。如果未安装设备,则在将设备另外放入““ Requires”之后,服务会在启动设备之前先安装设备。


你是对的。如果安装失败,则无论如何都会启动my-daemon.service。After=只是命令顺序。Requires=强制必须存在cif支架(请参阅Sufiyan Ghori对此的回答)。我将更新我的答案。
bm-bergmotte
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.