写一些对于Linux进程的浅陋知道笔记。
对于进程与线程很多时候,我觉的我还是停留在概念的阶段。也就知道一个进程是操作系统分配的资源,每个进程至少要有一个线程,进程与进程之间都是独立的等等,其实文字下面的意思,很多我都不是很了解,也没有能力动手实践。
最近在学习docker,主要查看了pstree -p的命令,看到了进程树,让我对进程产生了很大的好奇。
首先我个人简单的理解,一个进程的启动,必须有一个父进程来启动,当然启动进程方式有很多,网上有很多介绍,我也看的云里雾里,就不详细写了。
一般的进程分为守护进程与非守护进程,在Python的代码中,可以通过代码实现,知道守护进程将跟随着父进程的关闭而关闭,但非守护进程不会,他应该会称为所谓的孤儿进程被操作系统编号为1的进程托管,也就是他的父进程变成了编号为1的进程。
当我们打开shell,在终端运行各种脚本的时候,其实shell中运行的bash就是你在shell中运行的所有进程的父进程,所以不管你是前台工作,还是后台通过&运行,只要shell一关闭,bash就会给自己下面的所有子进程发送关闭信号,告诉他们我要死了,你们陪我殉葬吧,因为那些在shell中运行的进程都是bash的子进程,而且都是守护进程,那也就只能乖乖的跟着一起死了。
那难道让服务器运行一个脚本一定要一直开着shell,运行bash吗?答案肯定是否定的,其实关闭子进程只不过是向子进程发送了一个信号,也就是所谓的kill信号,这个具体我也不识很了解,就好比打了个电话告诉子女,你们可以去陪我死了。
理解了这个,就很好理解nohup了,nohup就是忽略父进程的信号,你她妈爱死不死,我假装没听到。这样的情况下,当bash退出,那些运行hup的忽略信号的子进程就会认1号进程也就是差不多我理解老大进程做爸爸。
Python中所谓的非守护进程,我不知道底层是不是也是通过忽略父进程的关闭信号来实现,父进程死了,子进程继续玩自己的,我觉的应该是。
水平实在有限,等有新的感悟,或者发现错误再来更改。