#!/bin/sh currentpath=$(cd "$(dirname "$0")"; pwd) jarFileName=$(ls "$currentpath"/*.jar 2>/dev/null) if [ -z "$jarFileName" ]; then echo "No .jar file found in the current directory." exit 1 fi process_ids=$(ps -ef | grep "$jarFileName" | grep -v grep | awk '{print $2}') if [ -z "$process_ids" ]; then echo "No matching processes found." else for pid in $process_ids; do kill $pid echo "Terminated process with PID: $pid" done fi JAVA_HOME=~/java/jdk1.8.0_181 if [ -z "$JAVA_HOME" ]; then echo "Error: JAVA_HOME is not defined." exit 1 elif [ ! -f "$JAVA_HOME/bin/java" ]; then echo "Error: JAVA_HOME is not valid." exit 1 else echo "JAVA_HOME is defined, $JAVA_HOME" fi JAVA="$JAVA_HOME/bin/java" currentpath=$(cd "$(dirname "$0")"; pwd) jarFileName=$(ls "$currentpath"/*.jar 2>/dev/null) if [ -z "$jarFileName" ]; then echo "No .jar file found in the current directory." exit 1 fi echo "Executing jar file: $jarFileName" if pgrep -f "$jarFileName" > /dev/null; then echo "Process is already running." else cd "$currentpath" jarFileNameWithoutExt="${jarFileName##*/}" jarFileNameWithoutExt="${jarFileNameWithoutExt%.*}" logFileName="${jarFileNameWithoutExt}.log" "$JAVA" -Duser.timezone=UTC -jar "$jarFileName" > "$currentpath/$logFileName" 2>&1 & echo "Started new process with log file: $logFileName" fi
时间: 2025-07-07 18:42:06 浏览: 2
<think>好的,用户想了解如何通过Shell脚本管理JAR文件的进程,包括检查、终止、重启,并正确记录日志。我需要根据提供的引用资料来构建一个合适的脚本,并确保符合用户的要求。
首先,用户提到的引用中有几个关键点需要注意。比如,引用[1]提到使用pgrep -f来查找进程,这比ps和grep更可靠,避免了潜在问题。另外,日志输出要定向到特定文件,如${CENTER_NAME}.log,这样便于管理。还有参数检查和退出码的处理,这些都需要在脚本中实现。
接下来,我需要考虑脚本的结构。通常,这种脚本会处理start、stop、restart和status等命令。每个命令对应的操作不同,比如启动时检查进程是否存在,停止时找到PID并kill,重启则是先停止再启动。
对于启动操作,用户可能希望后台运行JAR包,并使用nohup防止终端关闭导致进程终止。同时,日志需要重定向到指定文件,如app.log,这可以通过nohup命令实现。例如:nohup java -jar $JAR_NAME >> $LOG_FILE 2>&1 &。
停止操作需要找到进程的PID,可以使用pgrep -f $JAR_NAME,然后检查是否存在,存在的话就用kill命令终止。这里要注意,如果进程不存在,应该给出提示,避免错误。
状态检查则是通过pgrep查找进程是否存在,并输出相关信息。重启操作就是先执行stop,再执行start。
日志记录方面,需要确保所有输出(包括标准输出和错误输出)都追加到日志文件中,使用>>和2>&1来实现。引用[1]和[5]都提到了日志文件的管理,所以脚本中需要定义LOG_FILE变量,并指定路径。
另外,参数检查也很重要。脚本需要验证用户是否提供了正确的参数,比如JAR文件名和操作命令。如果参数缺失或不正确,就调用usage函数显示帮助信息,类似引用[1]中的处理。
还要注意进程检查的准确性。使用pgrep -f可以根据完整的JAR文件名来查找进程,避免误杀其他Java进程。引用[3]提到使用grep -v来排除grep自身,但pgrep可能更直接。
最后,脚本的权限和用法需要说明,比如使用chmod +x添加执行权限,并给出启动、停止等命令示例。用户可能还会关心如何查看日志,所以可以提示使用tail -f命令实时查看日志。
总结下来,脚本需要包含参数检查、日志配置、进程管理函数(start、stop等),并确保每个步骤的错误处理和提示信息。同时,引用相关资料中的优化点,比如避免使用ps和grep组合,改用pgrep,以及正确的日志重定向。</think>### Shell脚本管理Java进程操作指南
通过Shell脚本管理Java进程需要包含进程检查、状态监控、日志记录等核心功能。以下是分步实现方案:
---
#### 一、基础脚本框架(含参数检查)
```shell
#!/bin/bash
JAR_NAME=$1
CMD=$2
LOG_FILE=app.log
# 参数检查
if [ $# -lt 2 ]; then
echo "用法: $0 <jar文件名> [start|stop|restart|status]"
exit 1
fi
# 进程检查函数
is_exist(){
pgrep -f "$JAR_NAME" >/dev/null 2>&1
return $?
}
```
---
#### 二、核心操作模块
1. **启动进程**(带日志记录)
```shell
start(){
is_exist && { echo "$JAR_NAME 已在运行 (PID: $(pgrep -f $JAR_NAME))"; exit 1; }
nohup java -jar $JAR_NAME >> $LOG_FILE 2>&1 &
echo "启动成功 | 日志输出到: $LOG_FILE"
}
```
2. **停止进程**(安全终止)
```shell
stop(){
is_exist || { echo "$JAR_NAME 未运行"; exit 1; }
pkill -f "$JAR_NAME"
sleep 2
is_exist && { echo "强制终止进程"; kill -9 $(pgrep -f $JAR_NAME); }
echo "$JAR_NAME 已停止"
}
```
3. **状态查询**
```shell
status(){
is_exist && echo "$JAR_NAME 正在运行 (PID: $(pgrep -f $JAR_NAME))" || echo "$JAR_NAME 未运行"
}
```
---
#### 三、日志管理优化
1. **日志滚动**(防止文件过大)
```shell
# 在start函数添加
LOG_MAX_SIZE="100M"
[ -f "$LOG_FILE" ] && \
find "$LOG_FILE" -size +$LOG_MAX_SIZE -exec mv {} "$LOG_FILE.old" \;
```
---
#### 四、使用示例
```shell
# 赋予执行权限
chmod +x manage_jar.sh
# 启动应用
./manage_jar.sh app.jar start
# 查看实时日志
tail -f app.log
```
---
#### 关键点说明
1. **进程精准识别**:通过`pgrep -f`匹配完整JAR名称,避免误操作其他Java进程[^1]
2. **日志重定向**:`>>`实现日志追加,`2>&1`合并错误输出与标准输出[^5]
3. **安全停止**:先尝试普通终止(pkill),失败后执行强制终止(kill -9)[^2]
阅读全文
相关推荐

















