BUILD_ID=dontKillMe nohup java -jar -Dserver.port=8520 $JAR_NAME.jar > dev-hbnd-risk.log 2>&1 & 什么意思
时间: 2024-04-22 16:25:42 浏览: 360
这是一个用于启动一个 Java 应用程序的命令。让我解释一下每个部分的含义:
- `BUILD_ID=dontKillMe`:这是一个环境变量,用于告诉操作系统不要终止该进程。
- `nohup`:这是一个命令,用于在后台运行进程,并且即使用户退出登录也不会被终止。
- `java -jar`:这是运行 Java 应用程序的命令。`-jar` 标志告诉 Java 解释器要执行一个打包成 JAR 文件的应用程序。
- `-Dserver.port=8520`:这是一个系统属性,用于指定应用程序要使用的服务器端口号(在此示例中为 8520)。
- `$JAR_NAME.jar`:这是一个变量,代表要运行的 JAR 文件的名称。在此命令中,使用了一个环境变量来表示该变量。
- `> dev-hbnd-risk.log 2>&1`:这是将应用程序的输出重定向到一个文件中。`>` 符号将标准输出重定向到指定的文件(在此示例中为 `dev-hbnd-risk.log`),`2>&1` 将标准错误也重定向到同一个文件。
- `&`:这是一个特殊符号,用于将命令放入后台运行。
因此,该命令的作用是在后台运行一个 Java 应用程序,并将输出日志写入 `dev-hbnd-risk.log` 文件。该应用程序将在 8520 端口上监听请求。
相关问题
#!/bin/bash # 服务名称 SERVER_NAME=edu_server # 工程所在路径(根据自己情况进行调整) APP_HOME=/var/jenkins_home/edu # maven打包后的jar包名 JAR_NAME=like-admin-1.0.0.jar # jar包的目录 JAR_PATH=${APP_HOME}/target # 杀死之前的进程 PID_FILE="${APP_HOME}"/"${SERVER_NAME}".pid if [ -f "${PID_FILE}" ];then PID=`cat "$PID_FILE"` && kill -9 $PID && echo "kill process "${PID}" finished!" fi cd $JAR_PATH # 修改文件权限 chmod 755 $JAR_NAME # 启动服务 BUILD_ID=dontKillMe nohup java -jar $JAR_NAME & # 将新进程ID写到文件中 JAVA_PID=$! echo "${JAVA_PID}" > "${PID_FILE}" 现在该项目下有两个需要启动的服务,一个是like-admin-1.0.0.jar 另一个是 like-front-1.0.0.jar 现在修改改脚本,让jenkins在构建的时候能同时启动两个服务
<think>好的,我需要帮助用户修改现有的Shell脚本,以便在Jenkins构建时同时启动两个Spring Boot服务:like-admin-1.0.0.jar 和 like-front-1.0.0.jar。首先,我需要理解用户当前的情况和目标。
用户已经使用Jenkins来自动化部署Spring Boot项目,但现在希望同时启动两个不同的JAR包。现有的脚本可能只能处理一个服务,或者需要调整以支持多个实例。我需要考虑如何正确编写Shell脚本来启动两个服务,并确保它们在后台运行,同时处理可能存在的端口冲突或日志管理问题。
首先,启动单个Spring Boot JAR的典型命令是`java -jar xxx.jar`,但直接运行这个命令会阻塞终端,导致第二个服务无法启动。因此,需要让每个服务在后台运行,可以通过添加`&`符号来实现。例如:`java -jar like-admin-1.0.0.jar &`。不过,仅仅这样可能不够,因为当Jenkins任务结束时,后台进程可能会被终止。因此,可能需要使用`nohup`命令来保持进程运行,即使终端关闭。
接下来,需要处理日志输出。通常会将日志重定向到文件,方便后续查看。例如:`nohup java -jar like-admin-1.0.0.jar > admin.log 2>&1 &`。同样的处理需要应用到第二个服务。
然后,需要考虑服务之间的依赖关系。如果两个服务需要按顺序启动,比如admin服务必须在front服务之前启动,就需要在脚本中加入等待或检查机制。但用户的问题中没有提到这样的依赖,所以可能可以同时启动。
另外,需要确保两个JAR文件在部署时都被正确复制到目标目录,并且Jenkins的构建步骤能够正确调用这个Shell脚本。可能需要检查Jenkins的配置,确保工作空间中的路径正确,以及是否有权限执行脚本。
还需要处理可能出现的端口冲突。如果两个服务使用同一个端口,启动时会失败。用户需要确保两个JAR包的配置文件(如application.properties)中配置了不同的服务器端口,比如admin使用8080,front使用8081。
此外,停止现有服务的步骤也很重要。在部署新版本之前,可能需要先停止旧的服务进程。可以通过查找进程ID并杀死它们来实现。例如,使用`ps -ef | grep like-admin-1.0.0.jar`找到进程,然后用`kill -9 PID`结束进程。不过,这需要谨慎处理,避免误杀其他进程。
最后,脚本的健壮性也很重要。需要添加错误处理,比如检查命令是否执行成功,或者在启动失败时输出错误信息。同时,确保脚本在Jenkins环境中正确执行,可能需要设置正确的环境变量,如JAVA_HOME等。
总结修改步骤:
1. 停止正在运行的服务实例。
2. 同时启动两个JAR包,使用nohup和后台运行。
3. 重定向日志到文件。
4. 处理可能的环境配置问题,如端口、依赖。
5. 添加必要的错误检查和日志记录。
现在根据这些思考,编写具体的Shell脚本示例,并给出注意事项和相关建议,帮助用户实现目标。</think>### 分步解决方案
#### 步骤1:停止已有的服务进程
在启动新实例前,确保终止旧进程以避免端口冲突:
```bash
# 停止 like-admin 服务
ADMIN_PID=$(ps -ef | grep 'like-admin-1.0.0.jar' | grep -v grep | awk '{print $2}')
if [ -n "$ADMIN_PID" ]; then
kill -9 $ADMIN_PID
echo "已停止 like-admin 服务 (PID: $ADMIN_PID)"
fi
# 停止 like-front 服务
FRONT_PID=$(ps -ef | grep 'like-front-1.0.0.jar' | grep -v grep | awk '{print $2}')
if [ -n "$FRONT_PID" ]; then
kill -9 $FRONT_PID
echo "已停止 like-front 服务 (PID: $FRONT_PID)"
fi
```
#### 步骤2:编写启动脚本
使用`nohup`后台运行并分离日志文件:
```bash
#!/bin/bash
# 启动 like-admin 服务(假设已配置 server.port=8080)
nohup java -jar /path/to/like-admin-1.0.0.jar > /path/to/logs/admin.log 2>&1 &
echo "启动 like-admin 服务成功,日志:admin.log"
# 启动 like-front 服务(假设已配置 server.port=8081)
nohup java -jar /path/to/like-front-1.0.0.jar > /path/to/logs/front.log 2>&1 &
echo "启动 like-front 服务成功,日志:front.log"
```
#### 步骤3:Jenkins配置调整
1. **确保路径正确**:在Jenkins的构建步骤中指定脚本的绝对路径,例如:
```bash
/opt/scripts/start_services.sh
```
2. **权限设置**:通过`chmod +x start_services.sh`赋予脚本执行权限。
3. **环境变量**:在Jenkins全局配置中检查`JAVA_HOME`是否正确[^1]。
#### 步骤4:验证服务状态
添加检查逻辑确认服务是否启动:
```bash
# 检查 like-admin 进程是否存在
if ps -ef | grep -q 'like-admin-1.0.0.jar'; then
echo "like-admin 服务运行中"
else
echo "错误:like-admin 启动失败"
exit 1
fi
# 检查 like-front 进程是否存在
if ps -ef | grep -q 'like-front-1.0.0.jar'; then
echo "like-front 服务运行中"
else
echo "错误:like-front 启动失败"
exit 1
fi
```
### 关键注意事项
1. **端口配置**:确保两个JAR包在`application.properties`中配置不同端口,例如:
```properties
# like-admin 配置
server.port=8080
# like-front 配置
server.port=8081
```
2. **资源隔离**:若服务器资源有限,建议通过Docker容器隔离服务[^3]。
3. **日志管理**:定期清理日志文件或使用`logrotate`工具防止磁盘占满。
4. **构建顺序**:若项目依赖Maven多模块构建,需在Jenkins中配置`clean install`确保正确打包[^4]。
### 完整脚本示例
```bash
#!/bin/bash
# 停止旧服务
kill -9 $(ps -ef | grep 'like-admin-1.0.0.jar' | grep -v grep | awk '{print $2}') 2>/dev/null
kill -9 $(ps -ef | grep 'like-front-1.0.0.jar' | grep -v grep | awk '{print $2}') 2>/dev/null
# 启动新服务
nohup java -jar /data/jars/like-admin-1.0.0.jar > /data/logs/admin.log 2>&1 &
nohup java -jar /data/jars/like-front-1.0.0.jar > /data/logs/front.log 2>&1 &
# 等待进程启动
sleep 10
# 验证状态
if ! ps -ef | grep -q 'like-admin-1.0.0.jar'; then
echo "错误:like-admin 未启动"
exit 1
fi
if ! ps -ef | grep -q 'like-front-1.0.0.jar'; then
echo "错误:like-front 未启动"
exit 1
fi
echo "所有服务启动成功"
```
nohup java -jar eip.jar > ./nohup.out 2>&1 &
### 如何通过 `nohup` 命令后台运行 Java 程序并重定向日志
#### 背景说明
`nohup` 是一种用于在 Linux 和 Unix 系统中让程序忽略挂起信号(SIGHUP)的工具。当用户退出终端时,通常会导致正在运行的任务被中断,而使用 `nohup` 可以防止这种情况发生。此外,可以通过重定向操作符将程序的标准输出和标准错误输出保存到特定的日志文件中。
#### 实现方法
以下是几种常见的实现方式:
1. **默认情况下,输出会被重定向到 `nohup.out` 文件**
如果不指定任何重定向选项,默认情况下,`nohup` 的所有输出都会被写入名为 `nohup.out` 的文件中[^1]。例如:
```bash
nohup java -jar your_program.jar &
```
2. **将输出重定向到自定义日志文件**
若要将输出保存到其他位置而不是默认的 `nohup.out` 文件,则可以使用 `>` 或者 `>>` 来指定目标文件名。单个大于号 (`>`) 表示覆盖模式;双大于号 (`>>`) 则表示追加模式。例如:
```bash
nohup java -jar your_program.jar > Log.log &
```
上述命令会将标准输出重定向至 `Log.log` 文件,并且如果文件已存在则会清空其内容后再写入新数据。
3. **完全禁用输出记录**
若不需要保留任何形式的日志信息,可利用 `/dev/null` 设备节点丢弃所有的输出内容。这适用于那些无需关注执行过程中的打印消息的情况。具体做法如下所示:
```bash
nohup java -jar your_program.jar > /dev/null 2>&1 &
```
此处不仅正常流(`stdout`)指向了黑洞设备(`/dev/null`),而且还将异常流(`stderr`)也合并到了同一地方,从而实现了彻底屏蔽一切形式的信息反馈的目的[^2].
4. **按照日期动态创建日志文件**
对于长期运行的服务而言,可能更倾向于依据时间戳来区分不同时间段产生的日志条目。下面给出了一种基于月份分类存储每日独立日志的方法论实例演示代码片段:
```bash
nohup java -jar your_jar_file.jar > /path/to/logs/$(date +"%Y-%m")/output_$(date +"%Y-%m-%d").log 2>&1 &
```
在这条语句里头,我们借助 shell 内置函数 date 获取当前系统的年月(%Y-%m)以及完整的日期(%Y-%m-%d),进而构建出了一个分层结构化的路径布局方案以便更好地管理和检索历史档案资料[^4]。
#### 总结
以上介绍了四种不同的策略用来处理由 `nohup` 执行后的 Java 应用所产生的各类输出行为控制技巧。开发者可以根据实际需求灵活选用最适合自己的那套机制来进行相应的配置调整工作。
阅读全文
相关推荐
















