使用 sudo 创建另一个进程

使用 sudo 创建另一个进程

我编写了一个名为 testShell 的 shell 脚本。我使用命令运行此 shell:

sudo sh testShell

然后我用 ps -ef|grep testShell|grep -v grep

检查创建的进程。我发现系统为我创建了两个进程:

imcas@ubuntu:~$ ps -ef|grep testShell|grep -v grep
root      5687 32482  0 11:37 pts/1    00:00:00 sudo sh testShell
root      5688  5687 48 11:37 pts/1    00:00:08 sh testShell

从ppid中,我知道一个是父级,另一个是子级。现在我想杀死正在运行的shell脚本。我该怎么办?直接杀死子级还是应该杀死父级?我发现如果我使用 杀死孩子 kill -9 5688 ,孩子和父母都会被杀死。但是如果我使用 杀死父母 kill -9 5687 ,则只有父母被杀死。有谁能告诉我原因吗?

答案1

在Linux中,一旦父进程被杀死,它的子进程就会成为孤儿进程。但随后“热心”init进程采用了允许其继续进行的孤儿进程。

为了杀死父进程及其子进程,您可以使用:

pkill -TERM -P <parent's PID>

(注意:孤儿进程与僵尸进程不同,但这是另一个问题:-)

答案2

sudo通知父进程 ( ) 子进程已退出。由于父进程的唯一目的是运行该子进程,因此它会终止。其他进程不会仅仅因为您终止子进程而终止。

另一方面,子进程并不关心父进程做什么。父进程甚至可以在子进程创建后立即终止。sudo等待子进程退出,因为sudo需要子进程的退出代码作为其自己的退出代码。

相关内容