SSH가 백그라운드 프로세스를 기다리지 않는 이유는 무엇입니까?


13

ssh -t백그라운드 작업이 완료되기를 기다리지 않는 이유는 무엇 입니까?

예:

ssh user@example 'sleep 2 &'

2 초 후에 ssh가 반환되기 때문에 예상대로 작동하지만

ssh user@example -t 'sleep 2 &'

끝나기를 기다리지 않고 sleep즉시 돌아옵니다.

아무도 이것의 이유를 설명 할 수 있습니까? ssh -t돌아 오기 전에 모든 백그라운드 프로세스가 완료 될 때까지 기다리는 방법이 있습니까?

내 유스 케이스는로 ssh -t스크립트를 시작 하고이 스크립트는 기본 스크립트가 끝난 후에도 살아남 아야하는 여러 백그라운드 작업을 시작합니다. 함께 ssh -t이 지금까지 불가능합니다.

답변:


22

없이 -t, sshd하여 원격 셸의 표준 출력 (어린이 등의 취득 sleep이 파이프를 통해) 및 표준 오류 (그리고 또 다른 파이프를 통해 클라이언트의 입력을 보낸다).

sshd 사용자의 로그인 셸을 시작한 프로세스를 기다리지 만 프로세스가 종료 된 후 stdout 파이프에서 eof를 기다립니다 (openssh의 경우 stderr 파이프가 아님).

eof는 파이프의 쓰기 끝에서 열린 프로세스에 의해 파일 설명자가없는 경우에 발생합니다. 일반적으로 stdout을 다른 것으로 리디렉션하지 않은 모든 프로세스가 사라진 경우에만 발생합니다.

당신이 사용하는 경우 -t, sshd파이프를 사용하지 않습니다. 대신, 원격 쉘 및 해당 하위 항목과의 모든 상호 작용 (stdin, stdout, stderr)은 하나의 의사 터미널 쌍을 사용하여 수행됩니다.

의사 터미널 쌍을 sshd사용하면 마스터 측과 상호 작용 하기 위해 비슷한 eof 처리 또는 의사 터미널의 슬레이브 측에 fd가 열려있는 프로세스가 있는지 알 수있는 방법이 없으므로 종료를 기다립니다. 원격 사용자의 로그인 쉘을 실행 한 다음 종료되는 프로세스

종료시 pty 쌍의 마스터 측이 닫히므로 pty가 삭제되었음을 의미하므로 슬레이브에 의해 제어되는 프로세스는 SIGHUP을 수신합니다 (기본적으로 종료 됨).


1
철저한 답변에 감사드립니다! 내가 알고 싶은 또 다른 것 : 의사 터미널이 종료되면 모든 백그라운드 프로세스가 종료됩니까? 내가 시작하는 스크립트는 ssh와 잘 작동하는 서비스를 시작합니다. 그러나 ssh -t를 사용하면 서비스가 시작되지 않습니다. ssh가 반환되면 서비스가 종료되는 것 같습니다.
Philipp Murry

실제로 의사 터미널의 마스터 측에서 모든 슬레이브 파일 디스크립터가 닫 혔을 때 알 수있는 방법이 있습니다. 실제로 모든 파일 디스크립터가 닫 혔을 때 실제 터미널에서 트리거되는 것과 동일한 메커니즘입니다.
JdeBP


@JdeBP, 확장 하시겠습니까? 무슨 말인지 잘 모르겠습니다. AFAICT 터미널 에뮬레이터 (적어도 xterm 및 gnome-terminal)는 쉘에서 쉘을 실행할 때 슬레이브에 fd가 열려있는 프로세스에 대해서는 신경 쓰지 않습니다.
Stéphane Chazelas

@PhilippMurry nohup스크립트를 계속 실행하는 데 사용할 수 있습니다 . (내부에서 장기 실행 작업을 시작하여 tmux대화식으로 진행 상황을 모니터링 할 수도 있지만 로그 파일은
제대로

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