연결이 끊어지면 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이 기본적으로 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모듈을 확인하세요 .

관련 정보