杀死某个进程是我们经常使用的功能,UNIX利用了信号通信来进行进程间的协作,我们如何使用信号来杀死进程呢?

信号和一个整数值相关联,每当收到一个信号的时候,就会执行对应的信号处理程序来响应,shell脚本可以用来发送 接收信号,KILL也是用于终止进程

Ctrl c Ctrl z都是属于信号,kill可以用来向进程发送信号,trap来处理所接收到的信号

首先是可用的信号列表

kill -l

可以打印出所有可用的信号

图片

我们可以打印出信号数和信号名称

我们从最基础的使用开始,首先是终止一个进程

kill PROCESS_ID_LIST

这会发送一个默认的TERM的信号,进程ID可以发送多个,以空格隔开

如果需要发送指定的命令可以使用

kill -s SIGNAL PID

SIGNAL就是信号,可以发送信号名称,可以发送信号树

我们常用的信号有

SIGHUP 1 对进程或者终端进行挂起检测

SIGINT 2 当按下Ctrl+C发送该信号

SIGKILL 9 强行杀死进程

SIGTERM 15 终止进程

SIGTSTP 20 发送Ctrl + Z信号

当强行杀死进程的时候,可以

kill -s SIGKILL PROCESS_ID

kill -9 PROCESS_ID

我们还可以以进程的名字作为参数传递

我们传递的方式就是

kilall process_name

通过名称来向进程发送信号

killall -s SIGNAL process_name

通过名称来杀死进程

killall -9 process_name

例如

killall -9 gedit

如果需要杀死前进行进程确认,可以使用-i选项

指定杀死某个用户名下的某进程

killall -u USERNAME process_name

pkill类似kill命令,不过默认接收的pkill是进程名,不是进程ID,例如

pkill process_name

pkill -s SIGNAL process_name

SIGNAL是信号数字,无法使用这个数字对应的名称

trap命令在脚本中用信号分配信号处理程序,一旦是使用了trap将某个函数分配给了一个信号,当脚本收到这个信号,对应函数就会生效

trap ‘signal_handler_function_name’ SIGNALLIST

假设我们有一个如下的脚本呢

#!/bin/bash

function handler()

{

echo Hey,received signal : SIGINT

}

echo My process ID is $$

trap ‘handler’ SIGINT

while true;

do

sleep 1

done

在终端进行运行这个脚本,会一直运行,而且使用Ctrl+C,就会显示一行输出

因为Ctrl+C就是一个SIGINT的信号

然后我们又用了一个无限循环的while来保证一个一直运行,处于异步的状态,我们可以利用kill命令来将其杀死

单纯的Ctrl+C是无法将其终止的,因为Ctril+C是一个信号,而trap会接收所有的信号作为触发函数的条件

发表评论

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