打开一个新终端并在其中输入命令firefox&
,ps -l
给出:
4 R 1000 23132 23104 99 80 0 - 2177945 - pts/27 00:00:07 firefox
如果使用命令关闭 shell exit
,firefox 子进程将保持打开状态!
一直都是这样吗? Firefox 不是应该也关闭吗?最近的内核中是否有新的东西或者我缺少的东西?
那么结果ps -el|grep firefox
是:
4 S 1000 23132 1 14 80 0 - 2233312 poll_s ? 00:00:21 firefox
PPID 已更改为 1。
是什么导致 PPID 变为 1 ?
编辑:哦,我刚刚意识到关闭终端和关闭外壳程序有非常不同的结果:关闭终端确实会关闭所有子进程,但当使用 exit 命令关闭外壳程序时不会关闭...不知道为什么。 (关闭终端正在向所有子进程发送 SIGTERM?但是关闭 shell 会留下孤儿进程?)
答案1
最近的内核中是否有新的东西或者我缺少的东西?
不,如果一个进程退出,它的子进程继续运行,它们的父进程只是更改为init
(PID 1)。或者其他一些依赖于系统的进程,例如在 Linux 上查找“subreapers”。
情况一直如此,这就是允许nohup
有效工作的原因,以及通过分叉两次、调用setsid()
并退出父进程将进程转变为守护进程的陈旧进程。
关闭终端会话可能会发送SIGHUP
到那里的其余进程,但它们可以自由地忽略它(这就是所做的nohup
)。此外,systemd
可以配置为在终端登录会话退出时终止任何延迟进程,但您可能是firefox
从终端模拟器在 X 中运行,因此这不适用。