当前位置: 代码迷 >> 综合 >> 【Unix/Linux】【命令】【进程】终止进程 —— kill,killall命令
  详细解决方案

【Unix/Linux】【命令】【进程】终止进程 —— kill,killall命令

热度:90   发布时间:2023-12-14 19:51:08.0

kill命令

Linux中的kill命令用来终止指定的进程(terminate a process)的运行,是Linux下进程管理的常用命令。

通常,终止一个前台进程可以使用Ctrl+C键,但是,对于一个后台进程就须用kill命令来终止,我们就需要先使用ps/pidof/pstree/top等工具获取进程PID,然后使用kill命令来杀掉该进程。

kill命令是通过向进程发送指定的信号来结束相应进程的。在默认情况下,采用编号为15的TERM信号。TERM信号将终止所有不能捕获该信号的进程。对于那些可以捕获该信号的进程就要用编号为9的kill信号,强行“杀掉”该进程


命令格式:

kill  [参数]  进程号


命令功能:

发送指定的信号到相应进程。不指定信号将发送SIGTERM(15)终止指定进程。如果无法终止该程序可用“-KILL” 参数,其发送的信号为SIGKILL(9) ,将强制结束进程,使用ps命令或者jobs 命令可以查看进程号。root用户将影响用户的进程,非root用户只能影响自己的进程。

当用kill向这些进程发送信号时,必须是这些进程的主人。如果试图撤销一个没有权限撤销的进程或撤销一个不存在的进程,就会得到一个错误信息。

可以向多个进行发信号/终止它们。


命令参数:

  • -l 信号 —— 若果不加信号的编号参数,则使用“-l”参数会列出全部的信号名称
  • -a      —— 当处理当前进程时,不限制命令名和进程号的对应关系
  • -p      —— 指定kill 命令只打印相关进程的进程号,而不发送任何信号
  • -s      —— 指定发送信号
  • -u      —— 指定用户 


使用示例:

实例1:杀掉指定进程

kill 进程号


实例2:彻底杀死进程

kill -9 进程号

实例3:列出所有信号名称




killall命令

Linux系统中的killall命令用于杀死指定名字的进程(kill processes by name)。

我们可以使用kill命令杀死指定进程PID的进程,如果要找到我们需要杀死的进程,我们还需要在之前使用ps等命令再配合grep来查找进程,而killall把这两个过程合二为一。


命令格式:

killall  [参数]  进程名


命令功能:

用来结束同名的的所有进程。


命令参数:

  • -Z 只杀死拥有scontext 的进程
  • -e 要求匹配进程名称
  • -I 忽略小写
  • -g 杀死进程组而不是进程
  • -i 交互模式,杀死进程前先询问用户
  • -l 列出所有的已知信号名称
  • -q 不输出警告信息
  • -s 发送指定的信号
  • -v 报告信号是否成功发送
  • -w 等待进程死亡
  • --help 显示帮助信息
  • --version 显示版本显示


使用示例:

实例1:杀死所有同名进程

命令:

killall vi

输出:
[root@localhost ~]# ps -ef|grep vi
root     17581 17398  0 17:51 pts/0    00:00:00 vi test.txt
root     17611 17582  0 17:51 pts/1    00:00:00 grep vi
[root@localhost ~]# ps -ef|grep vi
root     17581 17398  0 17:51 pts/0    00:00:00 vi test.txt
root     17640 17612  0 17:51 pts/2    00:00:00 vi test.log
root     17642 17582  0 17:51 pts/1    00:00:00 grep vi
[root@localhost ~]# killall vi
[root@localhost ~]# ps -ef|grep vi
root     17645 17582  0 17:52 pts/1    00:00:00 grep vi



实例2:向进程发送指定信号

命令:

[root@localhost ~]# ps -ef|grep vi
root     17581 17398  0 17:51 pts/0    00:00:00 vi test.txt
root     17611 17582  0 17:51 pts/1    00:00:00 grep vi
[root@localhost ~]# ps -ef|grep vi
root     17581 17398  0 17:51 pts/0    00:00:00 vi test.txt
root     17640 17612  0 17:51 pts/2    00:00:00 vi test.log
root     17642 17582  0 17:51 pts/1    00:00:00 grep vi
[root@localhost ~]# killall vi
[root@localhost ~]# ps -ef|grep vi
root     17645 17582  0 17:52 pts/1    00:00:00 grep vi


输出:
[root@localhost ~]# vi & 
[1] 17646[root@localhost ~]# killall -TERM vi
[1]+  Stopped                 vi
[root@localhost ~]# vi & 
[2] 17648[root@localhost ~]# ps -ef|grep vi
root     17646 17582  0 17:54 pts/1    00:00:00 vi
root     17648 17582  0 17:54 pts/1    00:00:00 vi
root     17650 17582  0 17:55 pts/1    00:00:00 grep vi
[2]+  Stopped                 vi
[root@localhost ~]# killall -TERM vi
[root@localhost ~]# ps -ef|grep vi
root     17646 17582  0 17:54 pts/1    00:00:00 vi
root     17648 17582  0 17:54 pts/1    00:00:00 vi
root     17653 17582  0 17:55 pts/1    00:00:00 grep vi
[root@localhost ~]# killall -KILL vi
[1]-  已杀死               vi
[2]+  已杀死               vi
[root@localhost ~]# ps -ef|grep vi
root     17656 17582  0 17:56 pts/1    00:00:00 grep vi
[root@localhost ~]#