目录
背景
基础知识
新增命令
命令刷新及使用
刷新命令
普通方法结束多个进程
新命令结束进程
背景
众所周知在linux运维中经常会手动杀死某一个后台进程,常用的方法是【ps -ef|grep 关键词】找到进程后通过【kill 进程PID】来杀死进程,如果进程有很多个的时候通常是【kill PID1 PID2 PID3…】方式列出所有pid或者【ps -ef|grep -v grep |grep 关键词|awk '{print $2}'|xargs kill -9】这样通过管道和awk进行pid提取后在结束。一个偶然的机会,我觉得不像每次都慢慢去查pid然后kill,我想简化这些操作,要不怎么说懒人才是推动社会进步的唯一因素呢,我想直接给定一个关键词然后自动杀掉与之相关的所有进程,这个关键词可以是进程id、进程名字、进程描述或者进程应用的路径等包含的字符串,于是有了这个自定义命令【kills】类似的系统自带命令有一个叫killall,但killall用法又没去研究过,所以还是决定自己写一个
基础知识
在介绍命令前,会涉及到一下基础知识及命令
管道连接符:|
作用:将前一句的命令输出结果作为后一句命令的输入
进程查询命令:PS
作用: 查看服务器的进程信息
基本选项含义:
-e:列出全部的进程
-f:显示全部的列
文本搜索命令:grep
作用:根据用户指定的“模式”,对目标文本逐行进行匹配,并打印输出匹配到的行;
常用选项含义
-i : 忽略大小写;
-o : 仅显示匹配到目标字符串;
-v : 显示不能被匹配到的字符串(反转);
-E : 支持使用扩展的正则表达式字符串;
-q : 静默模式,不输出任何信息
文本处理命令:awk
作用:十分强大的文本和数据处理命令,逐行读取文本,默认以空格或tab键为分隔符进行分隔,将分隔所得的各个字段保存到内建变量中,并按模式或者条件执行编辑命令,支持用户自定义函数和动态正则表达式等先进功能。
常用选项含义
-F 指定分隔符,默认tab键
样例:【 echo '1:2:3 234' |awk -F ' ' '{print $2}'】 表示将字符串“1:2:3 234” 按指定的“:”进行分列,然后打印第二列,所以结果为2,如果打印第三列,结果则为3 234
[root@wangxf ~]# echo '1:2:3 234' |awk -F : '{print $2}'
2
[root@wangxf ~]# echo '1:2:3 234' |awk -F : '{print $3}'
3 234
样例:【echo '1:2:3 234' |awk -F ' ' '{print $2}'】 表示将字符串“1:2:3 234” 按指定的“空格”进行分列,然后打印第二列,所以结果为234,因为awk默认以空格或者tab分割,所以这里以空格分割可以省略不写,等同【echo '1:2:3 234' |awk '{print $2}'】
[root@wangxf ~]# echo '1:2:3 234' |awk -F ' ' '{print $2}'
234
[root@wangxf ~]# echo '1:2:3 234' |awk '{print $2}'
234
信号发送命令:kill
作用:给进程发送信号;
常用选项含义
1 终端断线
2 中断(同 Ctrl + C)
3 退出(同 Ctrl + \)
15 终止
9 强制终止
18 继续(与STOP相反, fg/bg命令)
19 暂停(同 Ctrl + Z
新增命令方法
在/etc/bashrc文件中添加的命令别名或者方法/命令是可以永久保存的,而且所有用户都能调用,所以一般我们可以在该文件中自定义别名或者自定义新方法/新命令
新增命令
执行【echo -e "kills(){\n ps -ef|grep -v grep|grep \$1|awk '{print \$2}'|xargs kill -9 \n}" >> /etc/bashrc】向/etc/bashrc文件末尾追加内容,追加后内容如下
kills(){
ps -ef|grep -v grep |grep $1|awk '{print $2}'|xargs kill -9
}
脚本解析
ps -ef :查询所有进程
|grep -v grep:从上一步结果中过滤当前查询本身的进程,即grep这一次执行这个进程,初次接触 可能不太好理解,举个栗子:就好比叫你跑步去操场统计有多少人在跑步,你肯定不能把你自己算上去,所以要剔除自己(虽然不排除已没问题,但后续执行结束命令的时候会因为这次查询已经查询完了而导致提示pid不存在而报错,但这个报错不影响最终结果,只是对于强迫症来说不太友好)
|grep $1:位置化参数,从上一步结果中提取包含变量$1内容的行($1变量的值是后续执行命令时跟的关键词) 即 kills java这个命令中的java,
|awk '{pring $2}':从上一步结果中通过awk提取第二列,(ps -ef的结果中,第二列是PID,即进程id)
|xargs kill -9:将上一步得到的PID发送给后续命令并作为参数执行,即强制杀死上一步中获取到的所有进程ID,一般推荐使用15,不推荐使用9,除非杀不掉的情况
命令刷新及使用
刷新命令
执行【source /etc/bashrc】刷新,使命令生效
root@wangxf ~]# source /etc/bashrc
[root@wangxf ~]#
使用原始普通方法结束多个进程
使用样例以httpd服务为例,可以看见当前httpd的服务有4个进程,以往的做法是通过【kill 3802 3803 3804 3805】一个个列出pid十分麻烦,或者通过管道以及awk等提取pid进行批量杀死,但每次都这样写明显很浪费时间(当然,这里只是举例,因为http的进程可以直接通过http的服务来管理,但比如你遇到一个需求,需要结束位于/opt/app下的所有进程呢,如果包括kafka、zk、es、tomcat、以及一大堆其他应用进程的时候后)
apache 3802 3786 0 11:43 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 3803 3786 0 11:43 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 3804 3786 0 11:43 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 3805 3786 0 11:43 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
root 4098 2583 0 11:45 pts/0 00:00:00 grep --color=auto httpd
[root@wangxf ~]# kill 3786 3802 3803 3804 3805
[root@wangxf ~]# ps -ef|grep -v grep|grep httpd|awk '{print $2}'|xargs kill -9
使用新命令结束进程
直接调用新命令【kills httpd】杀死所有进程信息中包含【httpd】关键词的进程,可以看出来在执行前有5个httpd的进程,执行完后所有httpd的进程已经被强制结束(举例:比如杀死所有的/opt/app下的进程,即 kills /opt/app)
[root@wangxf ~]# ps -ef|grep httpd
root 3786 1 0 11:43 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 3802 3786 0 11:43 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 3803 3786 0 11:43 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 3804 3786 0 11:43 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 3805 3786 0 11:43 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
root 4202 2583 0 11:48 pts/0 00:00:00 grep --color=auto httpd
[root@wangxf ~]# kills httpd
[root@wangxf ~]# ps -ef|grep httpd
root 4247 2583 0 11:48 pts/0 00:00:00 grep --color=auto httpd
[root@wangxf ~]#