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