我有一个 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= 的绝对路径名带有感叹号(“!”)前缀,则测试将被否定,并且只有当路径不存在时才会启动单元。