【问题标题】:Why use (ps -f&) to display process information, and then display the PPID of 1 instead of the PID of the main shell (-bash)? [closed]为什么用(ps -f&)显示进程信息,然后显示1的PPID而不是主shell的PID(-bash)? [关闭]
【发布时间】:2019-10-30 11:51:06
【问题描述】:

当我用(ps -f&)显示进程信息时,发现它的PPID是1,我一头雾水,为什么不是主shell的PID(-bash)?我继续执行相同的命令两次,并产生了一个奇怪的进程([bash] <defunct>),输出如下:

  • 第一个测试:
    [root@localhost ~]# (ps -f&)
    UID         PID   PPID  C STIME TTY          TIME CMD
    root       2078   2076  0 01:44 pts/0    00:00:00 -bash
    root       2244      1  0 03:07 pts/0    00:00:00 ps -f
    
  • 第二个测试:
    [root@localhost ~]# (ps -f&)
    UID         PID   PPID  C STIME TTY          TIME CMD
    root       2078   2076  0 01:44 pts/0    00:00:00 -bash
    root       2245   2078  0 03:07 pts/0    00:00:00 [bash] <defunct>
    root       2246      1  0 03:07 pts/0    00:00:00 ps -f
    

我测试了很多次,发现[bash] &lt;defunct&gt;进程很少出现(偶尔),但是ps -f进程的PPID总是1。

我的问题是:

  1. 为什么 PPID 是 ps -f 1 而不是主 shell (-bash) 的 PID?

  2. 什么是奇怪的[bash] &lt;defunct&gt; 进程?为什么第一次测试没有出现?

【问题讨论】:

    标签: linux bash shell process centos


    【解决方案1】:

    当您使用 & 符执行( ps -f &amp; ) 时,子shell 不会等待ps 进程,因此它可能会比ps 更早退出。如果是这样,ps 不再有一个父级会以wait/waitpid/waitid 获得其退出状态,所以在 UNIX 上发生的情况是这样的进程(所谓的orphan processes)通常会重新设置父级到init process (pid == 1)(Linux 还允许使用除 init 之外的子收割者的概念)。

    您在第二个测试中看到的是临时僵尸。当一个子进程退出时,它会变成一个僵尸([defunct]),直到它的父进程获得它的退出信息。您必须在它退出的那一刻抓住了子shell,但它的父shell(您的主shell)还没有设法获得它的退出信息。除非父 shell 以某种方式被阻止继续并因此获得退出信息,否则这应该只是一个临时的、暂时的状态。

    【讨论】:

    • 谢谢你的回答,我想请你给我推荐一些关于这些的有用的书。
    • @Treason 没问题。 《Unix 环境下的高级编程》是经典。
    猜你喜欢
    • 1970-01-01
    • 2020-08-21
    • 2019-05-10
    • 2014-09-19
    • 1970-01-01
    • 2013-01-21
    • 2016-11-01
    • 1970-01-01
    • 2021-04-04
    相关资源
    最近更新 更多