web-dev-qa-db-ja.com

ポートをリッスンしていない場合のSystemd再起動サービス

私は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。

5
Adrian Antunez

別の方法でアプローチし、専用の監視ツールを使用してこれを実現することをお勧めします。

サービスがクラッシュした場合、または構成されたポートでリッスンしなくなった場合にサービスを再起動できるようにする私のお気に入りの監視ツールは、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ファイルが必要です。

6
aseq