ssh가 죽었을 때 ssh에 의해 생성 된 kill 프로세스


23

이것은 여기뿐만 아니라 스택 교환 네트워크의 다른 사이트에서도 여러 번 해결 된 질문입니다 (예 : ssh 자체를 인터럽트 할 때 ssh가 원격 프로세스를 종료하도록 만드는 방법은 무엇입니까? ). 그러나 해결책을 찾지 못했습니다.

ssh를 통해 명령을 실행하고 있습니다. ssh를 종료 할 때마다 명령도 죽기를 원합니다. 이 명령은 Ctrl-C를 누를 때까지 무한정 실행되는 ktserver라는 데몬입니다.

다음과 같이 실행합니다. ssh -t compute-0-1 ktserver실제로 Ctrl-C를 누르면 프로세스가 정상적으로 종료되고 ssh 세션이 종료됩니다.

그러나 Ctrl-C를 누르는 대신 killSIGINT 또는 SIGHUP 전송 과 같은 명령을 사용하여 ssh 프로세스를 종료 하면 ktserver프로세스는 활성 상태로 유지됩니다.

어떻게 ktserver죽으면 어떻게 항상 죽을 수 ssh있습니까?

편집 : ktserver와 같이 완전히 다른 것을 실행하는 대신 gedit모든 것이 매력처럼 작동합니다 (예 : 연결이 죽으면 gedit이 죽습니다). 따라서 프로세스 자체에 문제가있을 수 있습니다. 예를 들어 SIGHUP 또는 SIGINT를 무시하고 있다고 생각했습니다. 그러나, 나는 실행할 때 kill -1 ktserver또는 kill -2 ktserver, 프로세스 다이 예상대로.

EDIT2 : Mark Plotnick이 지적했듯이 문제는 ssh 채널에서 통신하는 통신이 없다는 사실과 관련이 있습니다. ssh -t <host> read나중에 ssh 프로세스 를 실행 하고 종료하여 확인했습니다 . read여전히 살아 있고 발로 차있었습니다.


당신은 시도 했습니까 kill -9 ktserver?

@HermanTorjussen 물론입니다. 문제는이 명령이 다른 프로세스 내에서 실행되며 프로세스가 종료 될 수있는 많은 가능성을 제어 할 수 없기 때문에 ssh 세션과 관련이 있다는 것입니다. 따라서 프로세스가 종료 될 때마다 ktserver가 그 프로세스와 함께 종료되도록하는 확실한 방법이 필요합니다.
GermanK

Linux에 대한 나의 경험은 원격 명령이 죽은 TCP 연결에 대해 I / O를 수행하지 않으면 계속 실행된다는 것입니다. 내가 했어 ssh example.com dd ...애프터 완료 몇 시간에 실행되는 작업 ssh으로 인해 네트워크 문제로 연결 다이. 당신이 바꿀 수 있다면 ktserver잠시 한번 출력 뭔가 옵션을 취할, 그 해결 될 수있다.
Mark Plotnick

@MarkPlotnick 실제로, 나는 read원격 컴퓨터에서 실행 을 시도했지만 ssh 연결을 종료 한 후에도 read죽지 않았습니다. 불행히도, ktserver를 변경하여 아무것도 출력하지 못했습니다. 그렇다면 해결책이 없습니까?
GermanK

2
ssh가 죽으면 쉘도 죽는 것으로 가정합니다. 쉘이 종료 될 때 신호 -1 (SIGHUP)을 보내도록 쉘을 구성 할 수 있습니다. ( shopt -s huponexit). 이것이 당신을 위해 작동하는지 테스트 할 수 있습니까?
Hennes

답변:


13

일반적으로 ssh 연결이 죽으면 쉘도 죽습니다. 쉘이 모든 하위 항목으로 종료 될 때 신호 -1 (SIGHUP)을 보내도록 쉘을 구성 할 수 있습니다.

bash의 경우 내장 명령 shopt 를 통해이 옵션을 구성 할 수 있습니다 . ( shopt -s huponexit).

zsh의 경우 .setoptHUP


이것이 현재의 문제에 대한 답변이라고 생각했지만 작동하지 않는 것 같습니다. ssh $ host "scp LargeFile.dat $ OtherHost : / tmp"& pid = $! 그런 다음 다음과 같이 전송을 중지하려고합니다. shopt -s huponexit; $ pid를 죽이지 만 시작한 ssh를 죽일 때 scp가 멈추지 않습니다. 이견있는 사람?
David Doria

scp 명령을 시작 하기 전에 설정된 쉘 옵션으로 테스트 할 수 있습니까 ? 또는 쉘을 시작하고 shopt를 설정하고 scp를 시작하여?
Hennes

2
이것은 나를 위해 작동하지만 먼저 pty 대신 tty 할당을 강제 하는 ssh -t -t, ( -t두 번의 통지 !)를 사용하고 있는지 확인해야했습니다 .
Nicolas Wu

13

나는 그것을 -t -t인수로 사용하는 것이 단순히 ssh작동 한다는 것을 알았 습니다. huponexit원래 또는 원격 쉘로 설정할 필요가 없었습니다 .

나는 이것을 다음과 같이 테스트했다.

작동하지 않습니다 :

ssh user@remote sleep 100
^C

이로 인해 ssh 세션이 종료되었지만 슬립 프로세스가 여전히 원격 호스트에서 실행되고 있음을 알 수 있습니다 ( ps -ef | grep sleep표시).

작동합니다 :

ssh -t -t user@remote sleep 100
^C

이것은 ssh 세션을 종료하고 원격 절전 프로세스도 종료되었습니다. 또한 - SIGINT를 사용하는 경우 원격 프로세스로 전송되는 신호인지 확인했습니다 . 또한 프로세스에 적용된 SIGKILL (-9) 도 원격 프로세스 를 종료시킬 것임을 확인했습니다 .ControlCssh

편집 1 :

이었다 마찬가지 sleep보다 완고한 원격 프로세스 ..., I는 것으로 ssh달리 핸들 ^ C를 SIGINT있다. Ctrl- C일했지만,하지 kill -INT $pid않았다

여기 실제로 실제 응용 프로그램 (다른 답변에서 스털링)을 위해 작동 한 결과가 있습니다.

ssh -t -t -i id_rsa user@mic0 "/bin/sh -O huponexit -c 'sleep 100'"

큰 따옴표와 작은 따옴표의 중첩 사용에 유의하십시오. 원격 프로세스는 실제로 종료하여 SIGHUP에 응답해야합니다!


이것은 나에게 가장 효과가 있었지만 참고로 터미널 제어 문자가 번져서 재미있는 결과를 초래할 수 있습니다. 따라서 필자의 경우 쉬운 해결 방법은 명령을 호출하고 출력을 통해 파이프하는 것 cat입니다. 예 :ssh -ttq user@host '{ cmd; cmd; } | cat'
Droj

Ctrl-C항상 같지 않습니다. unix.stackexchange.com/questions/377191 / ... kill -INT $pid에 대한 내 답변 과 stackoverflow.com/questions/8398845 / ...에 대한 또 다른 답변을 참조 하십시오 ;-)
thecarpy

@thecarpy-첫 번째 대답은 Ctrl-C가 SIGINT와 유사 하고 다른 대답은 ^CSIGINT를 보냅니다 . 그들이 동일하지 않으면 정확한 차이점은 무엇입니까?
Mark Lakata

1

ssh가 신호를 전파하지 않으면 어떤 신호를받을 수 있습니까?

UPD. (JosephR 전용) : "ssh가 죽었을 때 ssh에 의해 생성 된 프로세스"라는 오해로 인한 문제 자체의 명백한 오류입니다. SSH는 일반적으로 프로세스를 생성하지 않지만 (때로는 그렇지 않지만 이것은 다른 이야기입니다) SSHD는 연결의 다른 측면을 볼 때 대신 수행합니다. SSH는 단지 의사 터미널 추상화 원격 서버에 의존합니다. 그렇기 때문에 도움이 될 수있는 유일한 것은 터미널이 연결된 프로세스에 신호를 방출하는 능력입니다. 이것은 모든 유닉스 계열 시스템에서 다소 기본입니다.


1
이것은 질문에 대한 답변을 제공하지 않습니다. 저자에게 비평을하거나 설명을 요청하려면 게시물 아래에 의견을 남겨주십시오.
Anthon

@Anthon, 설명입니다. 그러나 아무도 이것이 정답이라고 말하지 않습니다. 아래에 의견을 보내 주셔서 감사합니다.
poige

1
@poige 어쩌면 OP와 다른 사람들이 사용할 수 있도록 설명을 구체화 할 수 있습니다.
Joseph R.

@JosephR., 알았어요.
poige

1
"ssh 연결이 끊어졌을 때 sshd에 의해 생성 된 프로세스 종료"라고 말하면 더 나을까요? rephrasing이 어떤 식 으로든 내 문제를 해결한다고 생각하지 않습니다.
GermanK

0

여기에 게시 된 솔루션은 효과가 없었지만이 문제는 비슷한 문제에 대한 솔루션을 검색 할 때 처음 나타 났으며 -t -t여기에 속임수가 언급되었으므로 다른 사람들이 시도 할 수있는 솔루션을 게시 할 것입니다.

ssh -t -t -o ControlMaster=auto -o ControlPath='~/test.ssh' your_remote_ip_goes_here "your_long_running_command" &
sleep 100
ssh -o ControlPath='~/test.ssh' -O exit your_remote_ip_goes_here

이와 같이 연결이 종료되었을 때 장기 실행 명령이 더 이상 실행되지 않았습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.