为什么我的远程进程在杀死 ssh 会话后仍然运行?

Rya*_*son 16 linux ssh bash

我通过在本地 shell 中运行此命令来跟踪远程日志文件:

ssh remotemachine tail -100f /path/to/error_file
Run Code Online (Sandbox Code Playgroud)

当我 ctrl-c 退出此命令时,似乎 ctrl-c 会终止本地 ssh 进程并使我的尾巴在远程计算机上运行。我的印象是断开连接会发送挂断信号(因为我没有使用 nohup)并终止进程,但显然情况并非如此。

任何人都可以更清楚地了解何时发送挂断信号以及何时不发送?远程机器是 Ubuntu,我的本地 shell 是 OS X bash,如果其中任何一个有所不同。

小智 14

这种行为源于缺少运行进程的控制终端。当远程进程没有控制终端时,处理您的会话的远程 ssh 进程无法终止该命令,该命令处于僵死状态,最终由 init 清除。

您可以通过使用 -t 选项运行它来解决此问题,该选项为其提供了一个控制终端。当您远程 ctrl-c ssh 命令时,这将导致进程终止。

-t选项:

强制伪 tty 分配。这可用于在远程机器上执行任意基于屏幕的程序,这非常有用,例如在实现菜单服务时。多个 -t 选项强制 tty 分配,即使 ssh 没有本地 tty。

使用此选项时请查看man sshman sshd,因为控制终端还有其他含义,例如发送转义字符的能力。