kill

我们可以向 Linux 进程发多种类型的信号,其中最常用的工具就是 kill 命令。

我们常发的信号有(具体可见 kill -l 和 man 7 signal):
2 SIGINT(Ctrl + c)
15 SIGTERM(默认,让进程自动释放资源并自尽)
9 SIGKILL(绝杀,强制杀死进程并释放资源,该信号不能被忽略)
19) SIGSTOP suspend 进程到 stopped 状态(不可捕获)(ctrl+z)
20 SIGSTP suspend 进程到 stopped 状态(可捕获)(ctrl+z)
18) SIGCONT 继续(fg/bg)

SIGKILL 与 SIGSTOP 是不可以捕获的。

kill -9 迫使进程在运行时突然终止,类似于主机突然掉电。进程不是正常退出,系统资源无法正常释放(但不是说不能释放),尽量少用。

killall (kill processes by name)

killall 命令杀死同一进程组内的所有进程。指定要终止的进程的名称,而非 PID。

# killall httpd

这个命令也可以杀死某个用户的所有进程:

# killall -u username

pkill (based on name and other attributes)

pgrep, pkill 两个是一母同胞的兄弟,使用方法是一样的,通过进程名和其它进程属性来匹配进程(By Pattern),将其找出来或者发送信号。pkill 比 killall 命令更加灵活。

列出名为 sshd 且用户是 root 的进程:

$ pgrep -u root sshd

列出 root 用户或者 daemon 用户的进程

$ pgrep -u root,daemon

Trap

trap 用来指定收到信号时所采取的动作。

其语法是:

trap 'command' signal  <-- signale 是没有 SIG 前缀的信号名

例如,正常情况下,我们在执行脚本的过程中,如果按下 ctrl + c,脚本将中断运行,如果我们想改变 ctrl + c 的行为,可以这样做:

# cat cy.sh 
trap 'echo sleep 60s, then over...;sleep 60' INT
sleep 120

# sh cy.sh 
^Csleep 60s, then over...

这样,运行脚本的时候,执行 sleep 120,期间按下 ctrl + c,则会执行 echo sleep 60s, then over...;sleep 60,执行完成后,结束退出。

  • To reset a trap condition to the default, simply specify the command as -
  • To ignore a signal, set the command to the empty string ''
-- By 许望(RHCA、OCM、VCP)
最后修改:2020 年 01 月 02 日 08 : 34 PM
如果觉得我的文章对你有用,请随意赞赏