
我有一個 openvpn 隧道,它運行一個--up
腳本,該腳本查詢本地 mysql 資料庫以獲取 IP 路由信息,然後應用路由。但是,由於 openvpn 和 mysql systemd 服務都是使用該After=network.target
指令配置的,因此我有一個競爭條件:--up
腳本運行時 /var/run/mysqld/mysqld.sock 可能存在,也可能不存在。如果 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= 的絕對路徑名帶有感嘆號(「!」)前綴,則測試將被否定,並且僅當路徑不存在時才啟動單元。