私はDebian 8でしばらくSystemdを使用しています。障害が発生した場合にサービスをウェイクアップするには、Restart = on-failureオプションを使用します。
サービスが特定のポートをリッスンしていない場合(プロセスがまだ実行されている場合でも)、サービスを強制的に再起動する方法があるかどうかを知りたいです。
これが必要な理由は、この問題を修正するための新機能を開発しているためですが、しばらく時間がかかります。その間、回避策が必要です。
そのステータスを確認するためのスクリプトを開発しました。
#! /bin/bash
PORTS=( 1452 542 )
for port in ${PORTS[@]}; do
netstat -anp | grep $port > /dev/null 2>&1
if [ "$?" -ne 0 ]; then
# Port blocked. Kill the running process and start it again after a while
done
このスクリプトは、cronを使用して定期的にトリガーされます。これは汚いトリックです。そのため、その動作をSystemdチェックに統合したいと思います。それは可能ですか?
前もって感謝します。
乾杯、
A。
別の方法でアプローチし、専用の監視ツールを使用してこれを実現することをお勧めします。
サービスがクラッシュした場合、または構成されたポートでリッスンしなくなった場合にサービスを再起動できるようにする私のお気に入りの監視ツールは、monit:- https://packages.debian.org/jessie/monit
設定ファイル、このサイト、その他の場所には、設定に関する例がたくさんあります。使用がいかに簡単であるかを理解するために例をリストします。この例ではinit.dを使用していますが、systemdを使用するように簡単に変換できます。
プロセスが存在し、特定のポートでリッスンしていることをテストし、このテストが失敗したときにそれを開始するには:
check process example with pidfile /var/run/example.pid
start program = "/etc/init.d/example start"
start program = "/etc/init.d/example stop"
if failed Host 192.0.2.10 port 80 protocol http then restart
if 5 restarts within 5 cycles then timeout
プロトコルhttpの部分を省略でき、monitは単純なtcp接続を実行してテストしますでる。 protocol引数は、より複雑なテストを行って、たとえばhttp get要求などに実際に応答しているかどうかを確認します。
対応するpidファイルが/ var/runに作成されるように、プロセスまたはサービスが開始されていることを確認する必要があります。 Monit自体はそれを処理しません。通常、サービスがinitスクリプトまたはsystemdを介して開始される場合、/ var/runにpidファイルが必要です。