![为什么在终止 ssh 会话后我的远程进程仍在运行?](https://linux22.com/image/1211965/%E4%B8%BA%E4%BB%80%E4%B9%88%E5%9C%A8%E7%BB%88%E6%AD%A2%20ssh%20%E4%BC%9A%E8%AF%9D%E5%90%8E%E6%88%91%E7%9A%84%E8%BF%9C%E7%A8%8B%E8%BF%9B%E7%A8%8B%E4%BB%8D%E5%9C%A8%E8%BF%90%E8%A1%8C%EF%BC%9F.png)
我通过在本地 shell 中运行以下命令来跟踪远程日志文件:
ssh remotemachine tail -100f /path/to/error_file
当我按 ctrl-c 退出此命令时,ctrl-c 似乎会终止本地 ssh 进程,并使 tail 在远程计算机上运行。我以为断开连接会发送挂断信号(因为我没有使用 nohup)并终止进程,但事实显然并非如此。
有人能进一步解释一下何时发送挂断信号以及何时不发送挂断信号吗?远程机器是 Ubuntu,而我的本地 shell 是 OS X bash,如果其中任何一个有区别的话。
答案1
此行为源于正在运行的进程缺少控制终端。当远程进程没有控制终端时,处理您的会话的远程 ssh 进程无法终止该命令,该命令将处于僵死状态,最终由 init 清理。
您可以通过在运行时使用 -t 选项来解决这个问题,这将为其提供一个控制终端。当您远程按 ctrl-c 执行 ssh 命令时,这将导致进程终止。
这-t选项:
强制分配伪 tty。这可用于在远程计算机上执行任意基于屏幕的程序,这非常有用,例如在实现菜单服务时。多个 -t 选项强制分配 tty,即使 ssh 没有本地 tty。
看一下人SSH和人 sshd当您使用此选项时,因为拥有控制终端还有其他含义,例如发送转义字符的能力。