我有一个特殊的问题。我的服务器同时支持多个 ssh 会话,以便多个管理员可以同时管理(通过命令行界面)它。我们有一个命令来ztail
显示压缩的日志文件。现在,当当前 ssh 会话关闭时(无需按Ctrl-C来停止ztail
命令),该命令理想情况下应该停止工作。但是当我启动一个新的 ssh 会话时,我观察到,ztail
即使前一个会话已关闭,进程 ( ) 仍在后台运行并消耗我的 CPU。现在我如何知道会话何时关闭,以便我可以使用该变量/标志来关闭/停止先前关闭的会话启动的任何命令?
答案1
仅当您ztail
作为新的根级进程(即没有父进程)运行(或任何其他命令)时,例如在后台或通过 cron,才会发生这种情况。
通常,当您启动标准ssh
会话时,您会得到一个 shell 进程,它是您启动的所有程序的根进程。如果ssh
会话终止,内核也会杀死所有子进程。 (这就是为什么人们通常使用screen
或类似的东西来保留会话。)
因此,对您来说最简单的事情就是利用这种默认行为。查看根进程是ps axjf
什么ztail
,然后找出它为何在终止的ssh
会话中幸存下来。
答案2
在 ssh 会话期间,shell 会话将是一个子进程。该子进程将有另一个子进程:ztail
。关闭 shell 后 ztail 将失去其父母。与所有这些进程一样,它们将由 PID 为 1 的 init 执行。
如果 的parent-pidztail
是1,它很可能是你的“僵尸”之一。