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 ''