Answers:
如果没有-t
,sshd
则sleep
通过两个管道获取远程shell(和子类,如)和stderr的标准输出(并通过另一个管道发送客户端的输入)。
sshd
确实会等待启动用户登录Shell的进程,而且还会在该进程终止后等待stdout管道上的eof(至少在openssh中不是stderr管道)。
当管道的写入端上没有打开任何进程的文件描述符时,就会发生eof,这通常仅在没有将其stdout重定向到其他进程的所有进程都消失时才会发生。
使用时-t
,sshd
请勿使用管道。取而代之的是,使用一个伪终端对完成与远程外壳及其子级的所有交互(stdin,stdout,stderr)。
对于伪终端对,为了sshd
与主端进行交互,没有类似的eof处理或任何方法来知道是否仍有进程向伪终端的从属端开放fds,因此它仅等待终止。它执行远程用户的登录shell,然后退出的过程。
在该出口处,pty对的主侧关闭,这意味着pty被破坏,因此由从属控制的进程将收到SIGHUP(默认情况下将终止它们)。
nohup
用来保持脚本那样运行。(您也可以考虑在其中启动长期运行的作业,tmux
以便可以交互地监视其进度,但是日志文件可以正常工作。)