Systemd 启动顺序:等待 mysql.sock

Systemd 启动顺序:等待 mysql.sock

我有一个 openvpn 隧道,它运行一个--up脚本,该脚本查询本地 mysql 数据库以获取 IP 路由信息,然后应用路由。但是,由于 openvpn 和 mysql systemd 服务都配置了该After=network.target指令,因此我遇到了竞争条件:脚本运行时 /var/run/mysqld/mysqld.sock 可能存在--up,也可能不存在。如果 sock 文件不存在,那么我的脚本就会死掉,系统无法正确初始化。

我以为将 openvpn.service 指令更改为After=network.target mysql.service并运行systemctl daemon-reload就可以解决问题。但是,我ls -lh /var/run/mysqld/mysqld.sock在脚本开头添加了--up,但有时它仍然会报告ls: cannot access '/var/run/mysqld/mysqld.sock': No such file or directory

我的猜测是,systemd 没有使用 sock 文件来确定 mysqld 是否已完成加载,而是使用在创建 sock 文件之前发生的一些标准。

有没有办法告诉 systemd 在 sock 文件创建之前不要识别 mysql.service 已经启动?

答案1

我有同样的问题,在 mysql 启动后启动一些其他服务

首先我禁用我的服务

systemctl disable rfid-server

之后我修改了我的 rfid-server.service 文件

[Unit]
Description=rfid server
After=mysql.service

[Service]
ExecStart=/opt/rfid-server-service/deploy/start.sh

[Install]
WantedBy=multi-user.target mysql.service

我重新启用我的服务

systemctl enable /complete/path/to/service

Created symlink from /etc/systemd/system/multi-user.target.wants/rfid-server.service to /opt/rfid-server-service/rfid-server.service.
Created symlink from /etc/systemd/system/mysql.service.wants/rfid-server.service to /opt/rfid-server-service/rfid-server.service.
Created symlink from /etc/systemd/system/rfid-server.service to /opt/rfid-server-service/rfid-server.service.

如你所见,它创建了到 mysql.service.wants 的符号链接

答案2

也许您应该ConditionPathExists在您的服务文件中添加检查?

这里有来自 systemd 的引文文档

使用 ConditionPathExists= 时,会在启动单元之前检查文件存在条件。如果指定的绝对路径名不存在,则条件将失败。如果传递给 ConditionPathExists= 的绝对路径名带有感叹号(“!”)前缀,则测试将被否定,并且只有当路径不存在时才会启动单元。

相关内容