杀死某个进程是我们经常使用的功能,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会接收所有的信号作为触发函数的条件