#!/bin/bashecho "$1 jar包名称,$2 运行环境 " echo "====reload jar: $1 env: $2 ==== " if [ -z $1 ];thenecho "请输入jar包名称......."
elseecho "停止开始......."ID=`ps -ef | grep "$1" | grep -v "grep" | grep -v "reload.sh" | awk '{print $2}'`echo $IDfor id in $IDdokill -9 $idecho "killed $id"donesleep 2secho "停止成功......."echo "start $1"nohup java -Xms2048M -Xmx2048M -jar $1 --spring.profiles.active=$2 >/dev/null 2>&1 &echo "sucess"
fi
命令解析:
ps -ef | grep "hzz-ha-1.0-SNAPSHOT.jar" | grep -v "grep" | grep -v "reload.sh" | awk '{print $2}'
这条命令的作用是查找并输出运行指定jar包的进程ID,其中:
- `ps -ef`:列出所有进程信息
- `grep "hzz-ha-1.0-SNAPSHOT.jar"`:过滤包含该jar包名的进程
- `grep -v "grep"`:过滤掉grep自己的进程(第一层grep产生的进程信息)
- `grep -v "reload.sh"`:过滤掉运行这个脚本本身的进程,脚本名称:reload.sh
- `awk '{print $2}'`:打印出进程的PID,也就是命令的第二列
所以它通过两层过滤:
1. 第一层过滤找到包含指定jar包名的进程
2. 第二层过滤排除grep和脚本本身进程
最后用awk仅打印进程的PID。
这样可以准确定位到运行该jar的进程ID,而不会将grep和脚本本身也当成目标进程杀死。
整条命令实现了精确的进程搜索与过滤。
ID=`ps -ef | grep "$1" | grep -v "grep" | grep -v "reload.sh" | awk '{print $2}'`echo $IDfor id in $IDdokill -9 $idecho "killed $id"donesleep 2secho "停止成功......."
这段脚本代码是用于停止指定名称的Java进程,关键步骤解析如下:
1. 使用ps和grep查找指定名称进程的所有PID,并保存到变量ID中
2. 打印出找到的PID
3. 用for循环遍历PID列表
4. 对每个PID执行kill -9操作,强制停止该进程
5. 打印已停止的进程ID信息
6. sleep 2秒,留出停止进程的时间
7. 打印“停止成功”信息
这样通过先获取PID列表,然后循环终止进程,可以实现批量停止进程的效果。
for循环可以处理PID变量包含多个PID的情况,确保都会被停止,避免漏掉某些进程没有被结束。
使用:
./reload.sh xxx.jar dev