sh脚本中执行ps -ef | grep XXX | grep -v grep踩坑记录

本文探讨了脚本XXX.sh中使用ps-ef和grep可能导致的PID问题,即脚本运行时结束自身。通过修改文件名和grep过滤当前脚本,提供了两种解决方法。涉及的技术领域包括shell脚本和进程管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

pid=`ps -ef | grep XXX | grep -v grep | awk '{print $2}'`
echo $pid
for i in $pid
do
    kill -9 $i
done 

脚本文件XXX.sh 与 ps -ef|grep XXX 名字模糊匹配。运行脚本时,会查询出当前脚本运行的pid,在kill时就结束了当前脚本的运行,导致该脚本执行中断。

方法:1.修改脚本文件名;

           2.grep -v [脚本名称] 过滤当前脚本

### 如何在 Shell 中重启 Java JAR 包程序 为了实现 Java 应用程序(JAR 包)的重启操作,在 shell 脚本中可以采用先终止旧进程再启动新进程的方式。具体做法如下: #### 终止现有进程 通过 `ps` 命令查找正在运行的目标 JAR 文件对应的进程 ID (PID),并利用 `grep` 和 `awk` 工具过滤出确切的结果,最后使用 `kill -9` 来强制结束该进程。 ```bash kill -9 $(ps -ef | grep -v grep | grep xxx.jar | awk '{print $2}') ``` 这条命令会杀死所有匹配 `xxx.jar` 的进程[^1]。 #### 启动新的实例 接着可以通过 `nohup` 命令来忽略挂起信号,并将标准输出重定向至日志文件以便后续查看应用的日志信息;同时设置 JVM 参数以指定配置文件的位置以及字符编码格式等选项。 ```bash nohup java -Dfile.encoding=utf-8 -Dspring.config.location=/usr/local/bootstrap.yml -jar xxx.jar > log.out 2>&1 & ``` 上述指令会在后台执行给定的 Java 程序,并将其所有的控制台输出保存到 `log.out` 文件里。 #### 完整示例脚本 创建一个名为 `restart.sh` 的 Bash 脚本来封装以上两步逻辑,使得每次只需要调用这个单一入口即可完成重启动作。 ```bash #!/bin/bash # 获取当前目录下的 .jar 文件名作为变量 JAR_NAME="xxx.jar" # 查找并杀掉已存在的同名服务进程 kill -9 $(ps -ef | grep -v grep | grep ${JAR_NAME} | awk '{print $2}') echo "Stopped the old instance of ${JAR_NAME}" # 使用 nohup 在后台启动最新版本的服务 nohup java -Dfile.encoding=UTF-8 -Dspring.profiles.active=prod \ -jar /path/to/${JAR_NAME} >> /var/log/app.log 2>&1 & echo "Started a new instance of ${JAR_NAME}" ``` 此脚本不仅实现了基本的功能需求,还加入了简单的提示语句帮助理解每一步骤的目的所在。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值