杀掉 CentOS 进程
后台运行程序
以java运行jar包为例子,运行jar包并输出log文件(jar和log文件的路径最好是写成绝对路径)
nohup java -jar /opt/apps/springbootdemo.jar > /opt/logs/springbootdemo.log 2> &1 &
关键的地方是前面的nohup和最后的&,中间的运行命令和输出log文件都是可以自定义的,如果不需要log,可以将输出重定向到/dev/null中。
查找并杀掉进程
- 以java启动的jar为例,查找一个名为springbootdemo.jar的程序并杀掉
ps -eux|grep springbootdemo|grep -v grep|awk '{print $2}'|xargs kill -9
现在来将每一条命令拆开来简单说明下:
ps -eux这个命令,参数显示所有的用户进程和更多得进程信息;
grep springbootdemo这个命令就比较简单,找有对应的字符串行;
grep -v grep这个命令是取反操作,即找出不包含grep字符串的行;
awk '{print $2}'这个命令是默认按空格切分每一行(awk默认是以空格来切分一行数据来作为单独的列,并按编号排序,第一列是$1、第二列是$2,以此类推),并输出第二列的数据;
xargs kill -9这个是组合命令,kill -9是根据进程的PID来杀掉进程的,而xargs命令可以将前面的命令管道中的输出,传递到它后面指定的命令(kill -9)的参数,实现将找到的PID进程杀掉的目的。 - 还是以java启动的jar为例,查找一个端口为8080的程序并杀掉(注意netstat命令可能系统没有,需要手动安装)
netstat -ntulp|grep :8080|sed "s/.*LISTEN\s\+\([0-9]\+\)\/java/\1/g"|xargs kill -9
现在来将每一条命令拆开来简单说明下:
netstat -ntulp这个命令是列出所有系统中已占用的端口和对应的程序PID及名称;
grep :8080这个命令是找出对应的端口;
sed "s/.*LISTEN\s\+\([0-9]\+\)\/java/\1/g"这个是通过正则表达式过滤出进程的PID;
xargs kill -9组合命令,根据PID杀掉进程。 - 另外一种方式根据端口杀掉java进程
netstat -ntulp|awk '/:8080/{split($7,a,"/"); print a[1]}'|xargs kill -9
netstat -ntulp这个命令是列出所有系统中已占用的端口和对应的程序PID及名称;
xargs kill -9组合命令,根据PID杀掉进程;
awk的命令需要拆解来看:
/:8080/这部分是表示匹配8080端口;
split($7,a,"/");大括号中的第一个函数是根据一个分隔符/拆分字符串为数组,数组名称为a,$7表示的是一行中以空格分隔的第7列字段(捕获到的值应该是4578/java),数组中包含两个元素,分别是4578和java,4578就是要找的进程的PID;
print a[1]输出数组中的第一个元素(注意数组索引是从1开始的);
注意事项
- 有时候杀进程时会有权限不足的情况,这可能是因为启动这个进程的用户的权限优先级高于你正在使用的用户权限的优先级;
- 进程在僵死的情况下,会杀不掉,需要尝试杀掉它的父进程(最顶级的父进程是Linux系统本身,PID一般为1)

浙公网安备 33010602011771号