kill 、killall、pkill、xkill pgrep ps 命令解释

1、编写一段程序,使用系统调用fork( )创建两个子进程,再用系统调用signal(
)让父进
 程捕捉键盘上来的中断信号(即按ctrl+c键),当捕捉到中断信号后,父进程用系统调用kill(
)向两个子进程发出信号,子进程捕捉到信号后,分别输出下列信息后终止:  

终止一个进程或终止一个正在运行的程序,一般是通过 kill
、killall、pkill、xkill
等进行。比如一个程序已经死掉,但又不能退出,这时就应该考虑应用这些工具。

Child process 1 is killed by parent!

另外应用的场合就是在服务器管理中,在不涉及数据库服务器程序的父进程的停止运行,也可以用这些工具来终止。为什么数据库服务器的父进程不能用这些工具杀死呢?原因很简单,这些工具在强行终止数据库服务器时,会让数据库产生更多的文件碎片,当碎片达到一定程度的时候,数据库就有崩溃的危险。比如mysql服务器最好是按其正常的程序关闭,而不是用pkill
mysqld 或killall mysqld
这样危险的动作;当然对于占用资源过多的数据库子进程,我们应该用kill
来杀掉。

Child process 2 is killed by parent!

1 kill

父进程等待两个子进程终止后,输出以下信息后终止:

kill的应用是和ps 或pgrep 命令结合在一起使用的;

Parent process is killed!

kill 的用法:

 1 #include<stdio.h>
 2 #include<signal.h>
 3 #include<unistd.h>
 4 #include<sys/types.h>
 5 #include<sys/wait.h>
 6 int wait_mark;
 7 void waiting(),stop();
 8 void main()
 9 {int  p1, p2;
10 signal(SIGINT,stop);
11 while((p1=fork())==-1);
12 if(p1>0)                            /*在父进程中*/
13 {①
14 while((p2=fork())==-1);
15            If(p2>0)                    /*在父进程中*/
16             { ②
17                   wait_mark=1;
18                  waiting(0);
19                 kill(p1,10);
20                 kill(p2,12);
21                 wait( );
22                wait( );
23                printf("parent process is killed!n");
24                exit(0);
25             }
26            else                        /*在子进程2中*/
27            {
28 wait_mark=1;
29 signal(12,stop);
30 waiting();
31 lockf(1,1,0);
32 printf("child process 2 is killed by parent!n");
33 lockf(1,0,0);
34 exit(0);
35 }
36 } 
37 else                        /*在子进程1中*/
38 {
39       wait_mark=1;
40       signal(10,stop);
41       waiting();
42       lockf(1,1,0);
43       printf("child process 1 is killed by parent!n");
44       lockf(1,0,0);
45       exit(0);
46 }
47 }
48 void waiting()
49 {
50    while(wait_mark!=0);
51 }
52 void stop()
53 {
54    wait_mark=0;
55 }

kill [信号代码] 进程ID

 

注:信号代码可以省略;我们常用的信号代码是 -9 ,表示强制终止;

⑴运行程序并分析结果。

举例:

^C

[[email protected]
~]# ps auxf |grep httpd
root 4939 0.0 0.0 5160 708 pts/3 S+ 13:10 0:00 _ grep httpd
root 4830 0.1 1.3 24232 10272 ? Ss 13:02 0:00 /usr/sbin/httpd
apache 4833 0.0 0.6 24364 4932 ? S 13:02 0:00 _ /usr/sbin/httpd
apache 4834 0.0 0.6 24364 4928 ? S 13:02 0:00 _ /usr/sbin/httpd
apache 4835 0.0 0.6 24364 4928 ? S 13:02 0:00 _ /usr/sbin/httpd
apache 4836 0.0 0.6 24364 4928 ? S 13:02 0:00 _ /usr/sbin/httpd
apache 4837 0.0 0.6 24364 4928 ? S 13:02 0:00 _ /usr/sbin/httpd
apache 4838 0.0 0.6 24364 4928 ? S 13:02 0:00 _ /usr/sbin/httpd
apache 4839 0.0 0.6 24364 4928 ? S 13:02 0:00 _ /usr/sbin/httpd
apache 4840 0.0 0.6 24364 4928 ? S 13:02 0:00 _ /usr/sbin/httpd

child process 2 is killed by parent!

我们查看httpd 服务器的进程;您也可以用pgrep -l httpd 来查看;

child process 1 is killed by parent!

我们看上面例子中的第二列,就是进程PID的列,其中4830是httpd服务器的父进程,从4833-4840的进程都是它4830的子进程;如果我们杀掉父进程4830的话,其下的子进程也会跟着死掉;

parent process is killed!

[[email protected]
~]# kill 4840 注:杀掉4840这个进程;
[[email protected]
~]# ps -auxf |grep httpd
注:查看一下会有什么结果?是不是httpd服务器仍在运行?
[[email protected]
~]# kill 4830 注:杀掉httpd的父进程;
[[email protected]
~]# ps -aux |grep httpd
注:查看httpd的其它子进程是否存在,httpd服务器是否仍在运行?

 

对于僵尸进程,可以用kill -9 来强制终止退出;

⑵如果把signal(SIGINT,stop)放在①号和②号位置,结果会怎样并分析原因。

比如一个程序已经彻底死掉,如果kill
不加信号强度是没有办法退出,最好的办法就是加信号强度 -9
,后面要接杀父进程;比如;

1-

[[email protected]
~]# ps aux |grep gaim
beinan 5031 9.0 2.3 104996 17484 ? S 13:23 0:01 gaim
root 5036 0.0 0.0 5160 724 pts/3 S+ 13:24 0:00 grep gaim

[[email protected]
~]# pgrep -l gaim
5031 gaim
[[email protected]
~]# kill -9 5031

^C

2 killall

child process 2 is killed by parent!

killall 通过程序的名字,直接杀死所有进程,咱们简单说一下就行了。

parent process is killed!

用法:killall 正在运行的程序名

 

killall 也和ps或pgrep 结合使用,比较方便;通过ps或pgrep
来查看哪些程序在运行;

2-

举例:

^C

[[email protected]
beinan]# pgrep -l gaim
2979 gaim
[[email protected]
beinan]# killall gaim

parent process is killed!

3 pkill

 

pkill 和killall
应用方法差不多,也是直接杀死运行中的程序;如果您想杀掉单个进程,请用kill
来杀掉。

⑶该程序段前面部分用了两个wait(0),为什么?

应用方法:

关掉后一个wait

#pkill 正在运行的程序名

^C

举例:

child process 1 is killed by parent!

[[email protected]
beinan]# pgrep -l gaim
2979 gaim
[[email protected]
beinan]# pkill gaim

parent process is killed!root@kali:~/wyq/S4#

4 xkill

child process 2 is killed by parent!gcc -o S4_1-3.out S4_1-3.c

xkill 是在桌面用的杀死图形界面的程序。比如当firefox
出现崩溃不能退出时,点鼠标就能杀死firefox
。当xkill运行时出来和个人脑骨的图标,哪个图形程序崩溃一点就OK了。如果您想终止xkill
,就按右键取消;

 

xkill 调用方法:

两个都关掉

[[email protected]
~]#
xkill**************************************pgrep

^C

pgrep
是通过程序的名字来查询进程的工具,一般是用来判断程序是否正在运行。在服务器的配置和管理中,这个工具常被应用,简单明了;

发表评论

电子邮件地址不会被公开。 必填项已用*标注