koyoarda小伙伴们,接下来看一下进程的信号控制。如何使用信号来对进程进行控制?首先要了解常见的一些信号,这里列出了一些比较常见的信号,包括1、915,这些都是一些比较常见的信号。除此以外还有像18、continue、19stop,这都是一些可以使用的一些信号。
信号就像红灯停绿灯行一样,可以给进程发送这种信号,其实就是软件中断,然后来告诉进程应该怎么做。
首先来看一下通过kill命令对进程的信号发送的有好多命令,其中比较常见的是kill和killall这两个命令。先来看kill,先来列出一下当前所有的支持的信号,这些其实刚才给大家展示的只是其中一部分,大家注意一下,有信号的完整的名称,single、hop,编号是1,信号的编号是1,所以它有两个名字,一个是信号的编号,一个是信号的名称,这两者都可以用。
首先来创建几个进程,然后用kill的方式来给它发送信号。当然在正式发送信号之前也说一下有一些可以显示的请求发送信号,像可以直接对一个前端的进程按Ctrl+Z,这个在前面讲过,Ctrl+C,Ctrl+斜线这种方式来向进程发送显示的信号。
比方说当前有一个进程,展示一下,sleep 1000,这是一个前台进程,通过Ctrl+c,可能各位看到了,这边我按了一个,这个就是Ctrl+c的按键的结果,这是一种显示的方式,将进程进行的终止,也可以通过。
因为如果它不在前台,不在前端前台,就只能够找到它的PID,然后给它发送信号。现在都是拿sleep进行演示,实际上还有很多其它的,比如一会给大家从远端登录一下,先开启几个进程作为演示。这是演示的进程。
·想要发送信号,第一步要找到它的PID,可以通过ps aux,这个比较常见,过滤一下,这个时候大概的知道进程的名称。可以看到sleep1000进程的PID的是5676,这个时候可以通过kill的方式给它发一个信号。
·kill后面其实可以跟进程的PID,也可以跟前面讲到jobid作业ID,它使用%,所以%和不使%是有差别的。这边用到的是5676,首先要跟的其实应该是信号的名称,比如想要停止可以使用1015的信号默认信号,要是不写默认也就是15,它是以干净的方式去死掉。
·9是立即终止,无法被拦截忽略,直接就是致命的。所以如果使用的是没有加任何的信号的名字,这个是加了信号的名字信号的编号,没有加就是15。一般情况建议大家也不要想终止进程,不要随便的去强制终止,这样就可以,这个是等价于它是终止了。
·再来ps看一下,这个时候2000就没有了,也可以。再来看一下kill -9,这是强制的终止,后面同样加5681回车。大家看到这个是killed,有朋友说这个有什么区别?可能在现在看不出区别。
·讲的9和15信号,这个大家一定要注意,尽量不要用9,它是相当于是强制杀死,强制杀死可能连它自己的资源也来不及释放就杀死了,就相当于通知它死。它立马就举刀自尽。如果是15,它还把它的后事安排好,还告诉父线程说我要退出了,我要死了才会死的。
同学们如果不了解9和15的区别,给大家做一个示例看一下。这边现在打开file.2这个文件,这样先不保存,大家看一下所有文件,打开file2这个文件,假装在这里面改一改。
现在要给它发一个什么信号?发一个9的信号。首先要知道vim的PID是吧?找的PID应该是这个对不对?各位看它的PID是5750,给它发一个什么信号?如果发一个-9的信号,强制杀死是吧?后面跟的是5750,回车。
大家看到它没在当前显示,因为它不在终端,这边其实已经被kill掉了,已经退出来了。这个时候大家注意到它多了一个文件,多了一个交换文件,也就是一个vim其实根本没有来得及保存就直接被杀死了,采用了一种极端的方式杀死。
如果现在打开file2,它可报错了,它说有交换文件存在,那你要怎么做?可以回撤了一下,可以只读打开,也可以编辑,也可以恢复,也可以删除交换文件。先删除,再试一下。现在正常保存以后,交换文件应该还在,把交换文件删一下,删一下再次打开应该就没有问题,尝试一下。
当然现在再要给它发信号得重新看一下它的PID,因为每次重新启动以后PID也会变化是不是?发一个15的信号,15不用写,直接像这样就可以了。这边看到它是finished正常的终止,这样终止以后就没有产生交换文件,所以相当于如果是9,它是不会释放资源的。
什么情况用9?如果一个进程通过15信号发送的时候,它已经不理你了,它没有办法回应,那就采用强制的方式,9的方式。
·至于1是重启,重新启动重新初始化,一般情况可能用不上,因为很多进程,Apache Nginx是可以通过命令的方式,servie或者说systemoro的方试去重启的。所以这里9和15,这是用的比较多的两个。至于18和19也可以用,没问题也可以用,去将一个进程暂停或者说continue,这是关于基本的使用。
·这里补充一下,再补充一下,我这边sleep开几个进程,最后补充一下,20003000。现在ps aux过滤一下sleep,各位看到有好几个sleep是不是?还有两个3000,太好了。如果是kill,它后面只能跟PID,如果跟killall,它后面是可以跟名字的。
·现在kill,注意我这边没有指定哪个,因为这几个我觉得都可以干掉,5686580几的。大家看到全部的终止了,所以k2是可以跟名字的。除了ko和ko以外,还有什么pko很多方法,这些就慢慢再去用。
总之就是大家一定要记住9和15的区别,一般情况不要随便用,用9,因为它是强制的,除非进程是将死的无法杀掉,那就使用9。这大家听明白了吗?