我编写了一个名为 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
需要子进程的退出代码作为其自己的退出代码。