赞
踩
情景描述:
在生产查问题时,滴滴,微信来了个消息,原来是强哥有个需求,其实也就一句话
强哥:shell脚本,找到某个tomcat进程,并杀掉这个进程。
小编心里活动:这挫货停止个应用都不会呀?还亏得做了那么久。
小编:我等会给你
飞哥:哐哐哐一顿操作,几组脚本发来了,不愧是社会我飞哥,技术好呢,话不多,要啥脚本、命令直接给,不说废话。
ps aux | grep [t]omcat | awk '{ print $2}' | xargs -I {} kill -9 {}
kill -9 $(ps aux | grep [t]omcat | awk '{ print $2}')
ps aux | grep [t]omcat | awk '{ print "kill" " -9 " $2 }' | bash
大佬的命令我是绝对不会呀,飞哥教导我们说命令要一个个试,对飞哥的敬意之情油然而生。
借助飞哥的命令,咱们来梳理下停止进程的N种方法
小编只能想起来这么做,首先找到这个进程,找到这个进程的方法是
查看Linux的命令,以tomcat为例
[darren@DEV01 bin]$ ps -ef|grep tomcat
darren 723380 1 0 17:49 pts/0 00:00:03 /home/darren/dev/jdk-17.0.1/bin/java -Djava.util.logging.config.file=/home/darren/dev/apache-tomcat-10.0.12/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /home/darren/dev/apache-tomcat-10.0.12/bin/bootstrap.jar:/home/darren/dev/apache-tomcat-10.0.12/bin/tomcat-juli.jar -Dcatalina.base=/home/darren/dev/apache-tomcat-10.0.12 -Dcatalina.home=/home/darren/dev/apache-tomcat-10.0.12 -Djava.io.tmpdir=/home/darren/dev/apache-tomcat-10.0.12/temp org.apache.catalina.startup.Bootstrap start
darren 724676 721992 0 17:55 pts/0 00:00:00 grep --color=auto tomcat
[darren@DEV01 bin]$ sh shutdown.sh
找到线程,肉眼看一下进程的pid
根据PID进程kill掉进程,可以看出进程的PID 723380
[darren@DEV01 bin]$ kill -9 723380
将所有命令整合成一句话,一句搞定,将进程杀掉
[darren@DEV01 bin]$ ps -ef |grep tomcat |grep -v grep |awk '{ print $2 }' |xargs kill -9
命令解析:使用ps 找到进程,管道命令找出进程号,排除grep本身的进程, 使用awk即处理文本文件的语言输出进程号,将找到的参数进行强制停止
[darren@DEV01 bin]$ ps -ef |grep tomcat |grep -v grep |awk '{ print $2 }' |xargs kill -9
kill: not enough arguments
[darren@DEV01 bin]$
缺点:当进程不在的情况下会有报错,有工匠精神的程序员是不允许这样报错的,改进,这事得安排
[darren@DEV01 bin]$ ps -ef |grep tomcat |grep -v grep |awk '{ print $2 }' |xargs kill -9 >/dev/null 2>&1
这个命令遇到们没有的进程也不会报错,将正确错误丢到黑洞去了
[darren@DEV01 bin]$ kill -9 $(ps aux | grep [t]omcat | awk '{ print $2}')
命令解析:使用ps 找到进程,管道命令找出进程号, 使用awk即处理文本文件的语言输出进程号,将找到的参数进行强制停止。
小编:飞哥,这个命令很奇怪,为啥会带有[]呢?
飞哥:带有[]就不使用grep -v 排除自身了ps -ef |grep [t]omcat 不会出现 grep进程本身。因为字母加上 [ ] 后,此时 grep进程的参数是 grep --color=auto [t]omcat而 grep [t]omcat 正则表达式 匹配的是 ‘tomcat’ 这个字符串,因此这个 grep [t]omcat正则表达式 并不能匹配到 ’ [t]omcat’ 这个字符串。(也就是grep的进程)所以自然不会出现grep进程本身。
小编反思:忽然间想起了初三教化学的老师的一句话,学会和学会不一样,要做到知其然知其所以然,那飞哥做到了,强哥我俩佩服。
这个命令也是存在问题就是当进程不在的时候会报错,怎么办呢?把错误信息扔到黑洞去
[darren@DEV01 ~]$ kill -9 $(ps aux | grep [t]omcat | awk '{ print $2}') >/dev/null 2>&1
以下两个不会出现报错,是首选
[darren@DEV01 bin]$ ps aux | grep [t]omcat | awk '{ print $2}' | xargs -I {} kill -9 {}
命令解析:使用ps 找到进程,管道命令找出进程号, 使用awk即处理文本文件的语言输出进程号,利用xargs -I {} 将查到的结果传给后面的kill命令
[darren@DEV01 bin]$ ps aux | grep [t]omcat | awk '{ print "kill" " -9 " $2 }' | bash
命令解析:使用ps 找到进程,管道命令找出进程号, 使用awk即处理文本文件的语言输出进程号,print和$2之间是bash要执行命令
这个命令不会出现没有进程号报错的情况
检查下是不是真杀掉了,做到万无一失
[darren@DEV01 bin]$ ps -ef|grep tomcat
darren 724814 721992 0 17:56 pts/0 00:00:00 grep --color=auto tomcat
寄语:在交流的过程中飞哥说到,现在运维都要求会开发,做开发的都需要会运维,可见当前大环境不好的情况下我们还是要增强自身的实战和动手能力。
学习Linux命令就是积沙成塔的过程,像飞哥说的一样,命令这玩意要多试。多用多练才能孰能生巧,妙笔生花。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。