目录
一、需求描述
二、需求处理思路
1、根据关键字查询进程号
2、根据端口查询进程号
3、根据进程号杀进程
三、编写shell 脚本
总结
一、需求描述
在linux环境上,已知某个进程的运行关键字以及运行端口,要求根据已知信息查杀对应进程。要求编写shell脚本实现该功能。
二、需求处理思路
linux 上有根据进程关键字以及运行端口查询 对应进程ID的方法以及 杀进程的命令
1、根据关键字查询进程号
如: ps -ef |grep XXX ,ps 命令可以查询进程情况,一般来说用选项-ef 会更好的查看到信息:
比如查询相同的关键字:
ps -ef |grep XXX 是以全格式输出的进程信息 是包含了 运行的命令的路径的,内容显示从左到右分别是:
用户号UID 进程号PID 子进程号PPID C STIME TTY TIME 运行命令CMD 最后的cmd列是包含了命令具体的路径
而其他ps的参数则不然 :
ps:
ps -l 与ps -ef :
2、根据端口查询进程号
Linux 根据进程号查询的命令有:lsof 这个命令可以查看当前系统打开的所有文件 情况 lsof 需要访问核心内存和各种文件,所以必须以 root 用户的身份运行它才能够充分地发挥其功能。
一般情况下我们采用参数-i 查询指定端口相关信息: lsof -i:XXX
列信息分别是 : COMMAND PID进程号 USER用户 FD TYPE DEVICE SIZE/OFF NODE NAME
3、根据进程号杀进程
kill -9 PID 一般用kill -9进行杀进程,参数具体区别参考其他资料。
三、编写shell 脚本
编写脚本的关键点需要考虑:如果有多个进程都有相同的关键字,那么就不能使用 ps -ef 命令来确认进程号,而端口是唯一的,就可以通过查询端口对应的进程号,然后再通过kill -9 PID 来处理进程。
lsof -i:port 得到如下 信息:
输出的是两行信息,我们只需要提取PID对应的数据即可,那么如何提取呢?
通过awk 命令 结合使用:
lsof -i:8099|grep -v grep |awk 'NR==2{print $2}'
NR==2{print $2}表示就获取 第二列的第二行的内容。 NR==2{。。。。}就表示第二行
print $2表示: 第二列的内容
如果命令写成: lsof -i:8099|grep -v grep |awk '{print $2}'
最简单粗暴的做法: vi xxx.sh 然后输入如下内容:
#/bin/bash
PID=$(lsof -i:8099|grep -v grep |awk 'NR==2{print $2}')
echo ${PID}
if [ -n "$PID" ]; then
kill -9 $PID
echo "kill port 8099 PID success"
fi
然后保存 并给这个sh加上可执行权限,这样就可以查找端口并结束进程了。判断获取到的进程号信息,非空就杀掉
可以通过root 用户加上可执行权限; chmod +x test.sh
总结
关键点:PID=$(lsof -i:8099|grep -v grep |awk 'NR==2{print $2}') 获取到对应的进程号, 然后 判断进程号非空,非空情况进行结束进程 kill -9 $PID