我有一个需要挂载 NFS 的服务,但是失败了。
我使用 systemd escape 创建了一个挂载文件。挂载文件本身可以工作,启动后挂载点可用。它看起来像这样:
[Unit]
After=network.target
[Mount]
Type=nfs
What=10.1.1.10:/opt/company/product-category/product-name/mnt
Where=/opt/company/product-category/product-name/mnt
Options=rw,user,exec
[Install]
WantedBy=multi-user.target
我补充道RequiresMountFor=/opt/company/product-category/product-name/mnt
。
据我所知,这应该足以让我的服务等待 NFS 共享。我的程序需要 NFS 可用,它会尝试读取那里的文件,如果不可用,则会失败。所以我不确定这里出了什么问题。我猜是因为 NFS 太慢了,而 systemd 认为 NFS 可用。
如果我添加ExecStartPre=/usr/bin/sleep 3
到我的服务中它就会起作用。
您发现任何错误了吗?
您需要(复数)。您没有提到要将其添加到哪个单元,但要清楚,必须将其添加到服务单元中的部分中。
RequiresMountsFor=
[Unit]
确保检查
systemctl show -p After myservice
(与 相同Requires
)——两者都应在列表中显示您的 .mount 单元。(您也可以在 .service 中明确写入
Requires=
+After=
,并使用“systemd-escaped”.mount 单元名称而不是路径。)Systemd 不会根据时间“认为” NFS 可用。它通过读取 /proc/self/mountinfo 来准确知道已建立哪些挂载 - 事实上 systemd 是首先调用内核进行这些挂载的,因此它知道挂载调用何时返回以及返回结果如何。