Systemd 啟動順序:等待 mysql.sock

Systemd 啟動順序:等待 mysql.sock

我有一個 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= 的絕對路徑名帶有感嘆號(「!」)前綴,則測試將被否定,並且僅當路徑不存在時才啟動單元。

相關內容