我有一台服务器,将处理大量 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
模块。