linux基本功系列之kill命令实战

时间:2023-02-16 15:17:51

前言

大家好,又见面了,我是沐风晓月,本文是专栏【linux基本功-基础命令实战】的第47篇文章。

专栏地址:[[linux基本功-基础命令专栏]] , 此专栏是沐风晓月对Linux常用命令的汇总,希望能够加深自己的印象,以及帮助到其他的小伙伴????????。

如果文章有什么需要改进的地方还请大佬不吝赐教????????。

????个人简介:大家好,我是沐风晓月,双一流院校计算机专业???????? ???? 座右铭: 先努力成长自己,再帮助更多的人 ,一起加油进步????????????

一. kill 命令介绍

kill命令用来删除执行中的程序或工作。kill可将指定的信息送至程序。预设的信息为SIGTERM(15),可将指定程序终止。若仍无法终止该程序,可使用SIGKILL(9)信息尝试强制删除程序。程序或工作的编号可利用ps指令或job指令查看。

二. 语法格式及常用选项

依据惯例,我们还是先查看帮助 kill是一个内嵌命令,所有要把help放在前面,而不是kill --help ,而是 help kill。

Kill 成为 shell 内嵌有两个理由:

  • 它允许使用任务编号而不是进程号,
  • 并且在可以创建的进程数上限达到是允许进程被杀死。
[root@mufeng ~]# help kill
kill: kill [-s 信号声明 | -n 信号编号 | -信号声明] 进程号 | 任务声明 ... 或 kill -l [信号声明]
    向一个任务发送一个信号。
    
    向以 PID 进程号或者 JOBSPEC 任务声明指定的进程发送一个以
    SIGSPEC 信号声明或 SIGNUM 信号编号命名的信号。如果没有指定
    SIGSPEC 或 SIGNUM,那么假定发送 SIGTERM 信号。
    
    选项:
      -s sig	SIG 是信号名称
      -n sig	SIG 是信号编号
      -l	列出信号名称;如果参数后跟 `-l'则被假设为信号编号,
    	而相应的信号名称会被列出
    

为了更直观一些,我们把常用的参数用表格来展示:

参数 描述
-s sig SIG 是信号名称
-n sig SIG 是信号编号
-l 列出信号名称;如果参数后跟 `-l'则被假设为信号编号,而相应的信号名称会被列出

有了具体的参数之后,我们再来看实战案例:

三. 参考案例

3.1 列出所有的信号名称

使用-l 参数可以列出所有的信号名称

[root@mufeng ~]# kill -l
 1) SIGHUP	 2) SIGINT	 3) SIGQUIT	 4) SIGILL	 5) SIGTRAP
 6) SIGABRT	 7) SIGBUS	 8) SIGFPE	 9) SIGKILL	10) SIGUSR1
11) SIGSEGV	12) SIGUSR2	13) SIGPIPE	14) SIGALRM	15) SIGTERM
16) SIGSTKFLT	17) SIGCHLD	18) SIGCONT	19) SIGSTOP	20) SIGTSTP
21) SIGTTIN	22) SIGTTOU	23) SIGURG	24) SIGXCPU	25) SIGXFSZ
26) SIGVTALRM	27) SIGPROF	28) SIGWINCH	29) SIGIO	30) SIGPWR
31) SIGSYS	34) SIGRTMIN	35) SIGRTMIN+1	36) SIGRTMIN+2	37) SIGRTMIN+3
38) SIGRTMIN+4	39) SIGRTMIN+5	40) SIGRTMIN+6	41) SIGRTMIN+7	42) SIGRTMIN+8
43) SIGRTMIN+9	44) SIGRTMIN+10	45) SIGRTMIN+11	46) SIGRTMIN+12	47) SIGRTMIN+13
48) SIGRTMIN+14	49) SIGRTMIN+15	50) SIGRTMAX-14	51) SIGRTMAX-13	52) SIGRTMAX-12
53) SIGRTMAX-11	54) SIGRTMAX-10	55) SIGRTMAX-9	56) SIGRTMAX-8	57) SIGRTMAX-7
58) SIGRTMAX-6	59) SIGRTMAX-5	60) SIGRTMAX-4	61) SIGRTMAX-3	62) SIGRTMAX-2
63) SIGRTMAX-1	64) SIGRTMAX	

以上信号中常用的有以下几个:

信号 数字 描述
HUP 1 终端断线
INT 2 中断(同 Ctrl + C)
QUIT 3 退出(同 Ctrl + \)
TERM 15 终止
KILL 9 强制终止
CONT 18 继续(与STOP相反, fg/bg命令)
STOP 19 暂停(同 Ctrl + Z)

3.2 通过进程号杀死进程

先用ps找到进程号,在用kill -9 杀死进程

以下是代码案例:

[root@mufeng ~]# vim a.txt &
[1] 76182
[root@mufeng ~]# ps
   PID TTY          TIME CMD
 72532 pts/1    00:00:00 bash
 72584 pts/1    00:00:00 bash
 76111 pts/1    00:00:00 bash
 76182 pts/1    00:00:00 vim
 76191 pts/1    00:00:00 ps

[1]+  已停止               vim a.txt
[root@mufeng ~]# kill -9 76182
[root@mufeng ~]# ps |grep vim
[1]+  已杀死               vim a.txt
[root@mufeng ~]# 

我们通过 -9 来杀死进程,会发现一个问题:*.swp 没有被删除

这里的&表示在后台运行。当我们想让程序在后台运行的时候,就可以加上 & 符号。

有时候我们也会使用nohup,nohup是为了让程序在关闭终端后,依然可以运行,一般在查看日志的时候我们可以使用这种方式。

在杀死进程的时候,我们一般会加kill -9 ,-9 表示强制终止。如果我们再杀死进程的时候,不使用-9 默认会使用-15.

也就意味着 -15是kill的默认信号。

比如上面的代码中,我们查到PID为76182 , 这里就可以用:

# kill  76182

这条命令发信号让进程正常退出。所谓的正常退出是指按应用程序自己的退出流程完成退出,这样就可以清理并释放资源。

我们上面是VIP命令,如果是正常退出,就会自动删掉临时文件*.swp

3.3 使用9号信号的编号杀死进程

我们除了可以使用 kill -9 之外,还可以使用-9的编号,也就是 -SIGKILL 来杀死进程。

kill -SIGKILL 76182

通过这种方法稍微麻烦点,一遍直接用 -9就好,毕竟谁不喜欢简单呢?

3.4 根据PID暂停进程

[root@mufeng ~]# ping 127.0.0.1 &>/dev/null &
[1] 76828
[root@mufeng ~]# kill -STOP 76828
[root@mufeng ~]# ps |grep ping
 76828 pts/1    00:00:00 ping

[1]+  已停止               ping 127.0.0.1 &>/dev/null
[root@mufeng ~]# 
[root@mufeng ~]# jobs -l
[1]+ 76828 停止 (信号)         ping 127.0.0.1 &>/dev/null

这里我们用到一个命令叫jobs,他也属于一个基本的命令,可以关注后续的jobs命令。

这里只做个简单的介绍:

我们都知道在Linux中,启动、停止、终止以及恢复作业的这些功能统称为作业控制。

jobs命令允许查看shell当前正在处理的作业。

比如上面我们用的jobs -l 就是显示进程号,列出进程的PID和作业。

四. 与系统任务相关的命令

4.1 前后台任务调度和查询

与系统任务相关的命令比较多,虽然很多用不上,但我们也做个简单的介绍:

  • & 最经常被用到 这个用在一个命令的最后,可以把这个命令放到后台执行

  • ctrl + z 可以将一个正在前台执行的命令放到后台,并且暂停

  • jobs 查看当前有多少在后台运行的命令

  • fg 将后台中的命令调至前台继续运行 如果后台中有多个命令,可以用 fg %jobnumber将选中的命令调出,%jobnumber是通过jobs命令查到的后台正在执行的命令的序号(不是pid)

  • bg 将一个在后台暂停的命令,变成继续执行 如果后台中有多个命令,可以用bg %jobnumber将选中的命令调出,%jobnumber是通过jobs命令查到的后台正在执行的命令的序号(不是pid)

  • kill 发送信号给一个或多个进程(经常用来杀死一个进程);

  • ps 列出系统中正在运行的进程;

4.2 killall 和pkill

除了kill命令还有killall 和pkill命令,与kill的不同是:

kill 后面必须跟 PID 而killall和pkill跟的是 进程

比如我们要杀死MySQL进程:

# pkill  mysqld
# killall mysqld

为了防止误删,有时候我们会用到-i参数:询问是否杀死进程

[root@mufeng1 ~]# killall -i -9 bash
信号 bash(20782) ? (y/N) n
信号 bash(21263) ? (y/N) n
信号 bash(22452) ? (y/N) n
bash: no process found

这里可以看到-9 和kill一样,killall后面也可以加上 信号 ,比如9.

总结

kill命令在日常工作中,应用的比较广泛,一定要认真学习,记熟记牢常用参数。

✨$\textcolor{blue}{原创不易,还希望各位大佬支持一下}$ <br/> ???? $\textcolor{green}{点赞,你的认可是我创作的动力!}$ <br/> ⭐️ $\textcolor{green}{收藏,你的青睐是我努力的方向!}$ <br/> ✏️ $\textcolor{green}{评论,你的意见是我进步的财富!}$ <br/>

linux基本功系列之kill命令实战linux基本功系列之kill命令实战