我有一个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已经启动?
发布于 2019-07-16 12:07:32
我也有同样的问题,在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的符号链接。
发布于 2017-12-17 20:02:55
也许您应该在您的服务文件中添加ConditionPathExists检查?
有来自systemd 文档的引用:
使用ConditionPathExists=,在单元启动之前检查文件的存在情况。如果指定的绝对路径名称不存在,则条件将失败。如果传递给ConditionPathExists=的绝对路径名以感叹号("!")作为前缀,则测试将被否定,并且只有当路径不存在时才启动该单元。
https://serverfault.com/questions/888211
复制相似问题