解决jenkins结束后kill掉衍生进程

简介: 解决jenkins结束后kill掉衍生进程

前提nohup命令在命令行正常执行,仅限Jenkins执行脚本中nohup命令或SCM中执行错误或直接退出

1.问题

通过jenkins执行shell脚本时,脚本中是通过nohup java -jar &的方式启动,显示执行成功,但是服务却没启动,脚本如下:

nohup /usr/src/java/bin/java -Xms512m -Xmx512m -jar /opt/application/apps/finance-business-product-web-1.0.1.jar --spring.profiles.active=uat  >/opt/application/logs/product-web.log 2>&1 &

也就是说当通过Jenkins构建完后推送到业务服务器,在执行脚本时,脚本中的 nohup 命令无法正常退出,构建前台任务就卡住了,或者是nohup总是无效直接退出了。

2.排查

1.在命令行执行nohup命令,命令正常执行


2.Jenkins调用脚本执行非nohup命令,脚本执行正常

排查结论:jenkins执行非nohup命令,脚本执行正常,执行带有nohup脚本的时候出现了问题。也就是说构建命令中如果带有 nohup xxx & 触发构建后并构建成功后,虽然但在构建任务的输出中却显示没有问题,也没有任何报错,但是并没有执行shell脚本。

3.原因

jenkins默认会在构建完成后,杀掉构建过程中由shell命令触发的衍生进程。


jenkins根据BUILD_ID识别某个进程是否为构建过程的衍生进程,故修改BUILD_ID后,jenkins就无法识别是否为衍生进程,则此进程能在后台保留运行。


结论就是Jenkins程序只负责运行伪命令行nuhup 命令,并不保证是否成功运行 nuhup后面的命令。

4.解决

1.使用 BUILD_ID=xxx ,其中xxx可以是任意内容(只要不是原来的BUILD_ID内容即可)

#! /bin/bash

BUILD_ID=dontKillMe

nohup /usr/src/java/bin/java -Xms512m -Xmx512m -jar /opt/application/apps/finance-business-product-web-1.0.1.jar --spring.profiles.active=uat  >/opt/application/logs/product-web.log 2>&1 &

2.修改Jenkins启动参数

在JENKINS JAVA_OPTIONS中加入-Dhudson.util.ProcessTree.disable=true。需要重启jenkins生效


此方法配置一次后,所有的job都无需设置BUILD_ID,就能够防止jenkins杀死启动的tomcat进程

3.使用at now代替nohup命令(需要atd服务运行)

#! /bin/bash

set +e #执行的时候如果出现了返回值为非零将会继续执行下面的脚本

echo "/usr/src/java/bin/java -Xms512m -Xmx512m -jar /opt/application/apps/finance-business-product-web-1.0.1.jar --spring.profiles.active=uat  >/opt/application/logs/product-web.log" | at now

5.pipeline解决方法

在 Jenkins Pipeline 中,请使用JENKINS_NODE_COOKIE而不是BUILD_ID。

 

官方文档:https://www.jenkins.io/doc/book/managing/spawning-processes/#workarounds

抄自于:https://www.cnblogs.com/whm-blog/p/16779474.html

 

相关文章
|
7月前
|
监控 Shell Linux
【Shell 命令集合 系统管理 】⭐⭐⭐Linux 向进程发送信号 kill命令 使用指南
【Shell 命令集合 系统管理 】⭐⭐⭐Linux 向进程发送信号 kill命令 使用指南
112 0
|
7月前
|
Shell Linux 开发工具
linux shell脚本利用 kill -0 检查进程是否存在
linux shell脚本利用 kill -0 检查进程是否存在
245 1
|
6月前
|
Linux 数据处理
深入了解Linux命令kill:终止进程的艺术
**Linux的`kill`命令详解:高效管理进程的工具** `kill`命令在Linux中用于向进程发送信号,如SIGTERM(默认)和SIGKILL,以终止或影响进程行为。它通过进程ID(PID)操作,支持多种信号和选项,如`-l`列出信号,`-9`强制杀进程。例如,`kill 1234`发送TERM信号,`kill -9 1234`发送KILL信号。使用时注意,SIGKILL是不可忽视的,可能导致数据丢失。配合`pgrep`和`pkill`能更灵活管理进程。了解进程依赖和使用其他命令如`ps`和`top`可优化系统资源管理。
|
7月前
|
Web App开发
kill 终止进程
kill 终止进程。
57 7
|
7月前
|
Shell Linux
Linux脚本Shell脚本来实现一次性kill多个端口的进程
Linux脚本Shell脚本来实现一次性kill多个端口的进程
105 0
|
7月前
|
监控 Unix 调度
进程终结之道:kill与pskill的神奇战斗
进程终结之道:kill与pskill的神奇战斗
98 0
|
7月前
|
安全 Linux 开发工具
linux(三十二)系统信息命令kill终止进程
linux(三十二)系统信息命令kill终止进程
84 2
|
SQL 关系型数据库 MySQL
mysql中kill掉所有锁表的进程
mysql中kill掉所有锁表的进程
177 0
48Linux - 系统管理(终止进程:kill)
48Linux - 系统管理(终止进程:kill)
50 0
|
安全 IDE Java
进程管理:kill命令之-9与-15
kill :发送指定的信号到相应进程。不指定信号将发送SIGTERM(15)终止指定进程。若仍无法终止该程序可用“-KILL” 参数,其发送的信号为SIGKILL(9) ,将强制结束进程,使用ps命令或者jobs 命令可以查看进程号。root用户将影响用户的进程,非root用户只能影响自己的进程。
423 0