リモートPCでサービスの実行を監視し、その結果に応じて機能を実行しようとしています。したがって、関数は次のようになります。
- サービス「X」がシステム1で実行されている場合は、システム2で何もしないでください。
- サービス「X」が以下の場合実行されないシステム1からシステム2のサービス「Y」を開始する。
pgrep
だから私は次のように使用したいと思います。ssh
ssh [email protected] pgrep -x "service"
上記のコマンドラインの実行中に2つのシステム間の接続が失われると、スクリプトは中断されます。実行前に接続が切断されると、予想されるエラーで失敗します。
-o ConnectTimeout=1
接続が切断されたときにSSH接続が確立されたため、sshを実行しても問題は解決されませんでした。
結局、接続が失われ、スクリプトがさらに実行されると予想されます。ただし、数分経ってもリモートで実行されるコマンドに対してスクリプトが中断されます。
答え1
SSHクライアントがリモートシステムのSSHサーバーからの切断を検出するのに役立つように設計された2つのSSH構成オプションがあります。彼らは-o ServerAliveInterval=15
とです-o ServerAliveCountMax=3
。間隔は、クライアントがサーバー(リモートコンピュータ)から応答を要求するプローブ間の秒数です。最大数は、クライアントが切断されたことを確認するための連続失敗回数です。
クライアントが問題を検出してセッションを終了する(エラーコードをスクリプトに返すのに)、約45秒かかります。最大数を0(デフォルト)に設定すると、問題を検出するためのプローブが送信されず、10分以上かかることがあります。
私の考えでは、この組み合わせを45秒未満に設定すると、接続が切断されたときよりもネットワークが遅いときにSSHクライアントの接続が早期に切断され、監視が中断されるリスクが高くなります。間隔を60〜120秒より長く設定すると、ファイアウォールなどのネットワークデバイスがアイドル接続を切断するのではなく(接続を中断するのではなく)、接続を切断する危険があります。
TCPKeepAlive
(このオプションは、切断された接続を検出したり接続を維持したりするオプションほど有用ではないため、議論しませんでした。ServerAlive*
)
答え2
次のコマンドを使用して、制限付きコンテキストでtimeout
ラップできます。ssh
pid=$(timeout 10s ssh -n [email protected] 'pgrep -x service' 2>/dev/null)
ss=$?
case "$ss" in
124) echo "Timeout" >&2 ;;
1[23?) echo "Something went badly wrong ($ss)" >&2 ;;
0) echo "All is well" >&2 ;;
*) echo "An error occurred with the remote execution ($ss)" >&2 ;;
esac
if [ -z "$pid" ]
then
echo "No result from ssh pgrep" >&2
fi
文書(man timeout
)では期間を「オプションの接尾辞を持つ浮動小数点数:s
秒(デフォルト)、m
分、h
時間、またはd
日。」。