Bez -t
, sshd
pobiera standardowe wyjście zdalnej powłoki (i dzieci podobne sleep
) i stderr przez dwie potoki (a także wysyła dane wejściowe klienta przez inną potok).
sshd
czeka na proces, w którym uruchomił powłokę logowania użytkownika, ale także po zakończeniu tego procesu czeka na eof na standardowej rurze (przynajmniej nie na rurce stderr w przypadku co najmniej openssh).
A eof dzieje się, gdy żaden proces nie otwiera deskryptora pliku na końcu zapisu potoku, co zwykle dzieje się tylko wtedy, gdy wszystkie procesy, które nie zostały przekierowane na standardowe wyjście, znikną.
Kiedy używasz -t
, sshd
nie używa rur. Zamiast tego cała interakcja (stdin, stdout, stderr) ze zdalną powłoką i jej dziećmi odbywa się za pomocą jednej pary pseudo-terminali.
W przypadku pary pseudo-terminali do sshd
interakcji ze stroną master nie ma podobnej obsługi eof ani żadnego sposobu, aby dowiedzieć się, czy nadal istnieją procesy z fds otwartym na stronę slave pseudo-terminala, więc po prostu czeka na zakończenie proces, w którym wykonał powłokę logowania zdalnego użytkownika, a następnie kończy działanie.
Po tym wyjściu strona główna pary pty jest zamykana, co oznacza, że pty jest niszczona, więc procesy kontrolowane przez slave otrzymają SIGHUP (który domyślnie by je zakończył).
nohup
aby skrypt działał w ten sposób. (Możesz również rozważyć uruchomienie długotrwałych zadań wewnątrz,tmux
aby móc interaktywnie monitorować ich postępy, ale plik dziennika działa dobrze.)Użyj
wait
:źródło