私は(特定のコマンドを使用して)多くの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
モジュールを確認してください。