Systemd のブート順序: mysql.sock を待つ

Systemd のブート順序: mysql.sock を待つ

--up私は、IP ルーティング情報をローカルの mysql データベースに問い合わせてルートを適用するスクリプトを実行する openvpn トンネルを持っています。しかし、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 は、mysqld のロードが完了したかどうかを判断するために sock ファイルを使用しているのではなく、sock ファイルが作成される前に発生するいくつかの基準を使用していると考えられます。

sock ファイルが作成されるまで、systemd に 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= に渡される絶対パス名の前に感嘆符 ("!") が付いている場合、テストは否定され、パスが存在しない場合にのみユニットが開始されます。

関連情報