当连接断开时,sshd 应立即终止命令/shell/会话(无超时)

当连接断开时,sshd 应立即终止命令/shell/会话(无超时)

我有一台服务器,将处理大量 ssh 连接(使用特定命令)。每个连接都会消耗一些内存,因此我的目标是在连接断开后立即关闭会话(及其 shell/命令)。

我已经在 /etc/ssh/sshd_config 中尝试过

TCPKeepAlive no
ClientAliveInterval 0
ClientAliveCountMax 0

TCPKeepAlive yes
ClientAliveInterval 1
ClientAliveCountMax 1

但是,当我现在打开一个会话“ssh user@server sleep.py”,然后在客户端通过 CTRL+C 关闭时,会话仍然处于活动状态。

我的问题:为什么会话仍然处于活动状态并且没有收到 SIGHUP 信号?我能做些什么来让它工作,以便在连接断开时 shell 立即关闭?


发生什么电流:

客户端: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

测试.py

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

然后我运行./test.sh &,然后向 test.sh 进程发送 HUP 信号。 test.sh 进程终止,但 test.py 进程仍然存在。

您的 python 程序可以响应 HUP 信号,但您必须对其进行编程才能执行此操作。检查signal模块。

相关内容