接続が失われた場合、sshdはコマンド/シェル/セッションをすぐに終了する必要があります(タイムアウトなし)。

接続が失われた場合、sshdはコマンド/シェル/セッションをすぐに終了する必要があります(タイムアウトなし)。

私は(特定のコマンドを使用して)多くのSSH接続を処理するサーバーを持っています。各接続はわずかなメモリを消費するため、接続が切断されるとすぐにセッション(および対応するシェル/コマンド)を閉じることが目標です。

/etc/ssh/sshd_configで試しました。

TCPKeepAlive no
ClientAliveInterval 0
ClientAliveCountMax 0

そして

TCPKeepAlive yes
ClientAliveInterval 1
ClientAliveCountMax 1

ただし、「ssh user@server sleep.py」セッションを開き、クライアント側でCTRL + Cを介して閉じると、セッションはまだアクティブです。

私の質問:セッションがまだアクティブでSIGHUP信号を受信できないのはなぜですか?接続が切断されたときにシェルがすぐに閉じられるようにするにはどうすればよいですか?


どのような電流が発生しますか?

クライアント: ssh user@server sleep.py

仕える人:

1  root       0:00 /bin/sh -c /bin/bash /etc/app/run.sh
9  root       0:00   /usr/sbin/sshd -D
36 root       0:00      sshd: git [priv]
44 git        0:00         sshd: git@notty
45 git        0:00            sh -c sleep.py

クライアント:CTRL + C(終了コマンド)を押します。サーバー:

1  root       0:00 /bin/sh -c /bin/bash /etc/app/run.sh
45 git        0:00   sh -c sleep.py
9  root       0:00   /usr/sbin/sshd -D

答え1

ああ、ところでsshdプロセスはい終了。それはPythonプロセスを飛び越えるだけです。

問題は、PythonがデフォルトでHUP信号に応答しないために発生します。私は書いた:

テストファイル

#!/bin/sh
sh -c ./test.py </dev/null

test.py

#!/usr/bin/python
import time
time.sleep(20)

その後、HUP信号を実行して./test.sh &test.shプロセスに送信します。 test.shプロセスは終了しますが、test.pyプロセスはまだ存在します。

PythonプログラムはHUP信号に応答できますが、それを行うにはプログラムする必要があります。signalモジュールを確認してください。

関連情報