SSH가 백그라운드 프로세스를 기다리지 않는 이유는 무엇입니까? 무엇 입니까? 예: ssh user@example ‘sleep

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

예:

ssh user@example 'sleep 2 &'

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

ssh user@example -t 'sleep 2 &'

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

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

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



답변

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

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

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

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

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

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


답변

사용 wait:

ssh user@example -t 'sleep 2 & wait'


답변