Jenkins使用war包启动,kill进程之后做法思路

2022.8.15 Jenkins使用war包启动,kill进程之后做法思路

打包node包正常,远程传输ssh over显示失败。查看top。cpu直接拉满。

java.lang.OutOfMemoryError: GC overhead limit exceeded
	at java.io.UnixFileSystem.list(Native Method)
	at java.io.File.normalizedList(File.java:1115)
	at java.io.File.list(File.java:1159)
	at org.apache.tools.ant.DirectoryScanner.scandir(DirectoryScanner.java:1239)
	at org.apache.tools.ant.DirectoryScanner.scandir(DirectoryScanner.java:1267)
	at org.apache.tools.ant.DirectoryScanner.scandir(DirectoryScanner.java:1267)

jenkins重启无效。一气之下,后面直接kill掉进程。于是。。。发现以前jenkins是用类似

nohup java -jar jenkins.war --httpPort=8585 > output.txt 2>&1 &

方式启动的。想了一下。完犊子了~~大家千万别学我。。。这个锅我不背。

思路1:

后面放了参数。。查看了jenkins生产环境查看参数

root     25131     1  0 Mar17 ?        02:10:32 /opt/jdk1.8/bin/java -Djava.awt.headless=true -DJENKINS_HOME=/var/lib/jenkins -jar /usr/lib/jenkins/jenkins.war --logfile=/var/log/jenkin/jenkins.log --webroot=/var/cache/jenkins/war --httpPort=8585 --debug=5 --handlerCountMax=100 --handlerCountMaxIdle=20

想要逆推构建参数,发现失败。(pass)

思路2:

查看了之前构建的参数以及jenkins数据目录所在

/var/lib/jenkins/*尽快用tomcat来构建一个新的jenkins

首先构建环境

  • jdk
  • apache

jdk官网:https://www.oracle.com/java/

apache官网:http://apache.org/dyn/closer.cgi

上传到服务器

tar xf apache-tomcat-9.0.7.tar.gz
tar xf jdk1.8.0_131.tar.gz

解压并移动到喜欢的目录

mv jdk1.8.0_131 /opt/jdk1.8
mv apache-tomcat-9.0.7 /usr/local/tomcat

修改环境变量---->/etc/profile

#tomcat环境变量
echo 'export CATALINA_HOME=/usr/local/tomcat' >>/etc/profile
echo 'export PATH=$CATALINA_HOME/bin:$PATH' >>/etc/profile
#jdk1.8环境变量
echo 'export JAVA_HOME=/opt/jdk1.8' >>/etc/profile
echo 'export PATH=$JAVA_HOME/bin:$PATH' >>/etc/profile

刷新

source /etc/profile
#查看jdk环境变量
java -version

java version "1.8.0_131"
Java(TM) SE Runtime Environment (build 1.8.0_131-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)

#修改tomcat配置文件(修改想要的端口)

vim /usr/local/tomcat/conf/server.xml

    <Connector port="8585" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

#保存退出并启动tomcat

/usr/local/tomcat/bin/startup.sh

catalina.sh      daemon.sh        setclasspath.sh  startup.sh       version.sh
configtest.sh    digest.sh        shutdown.sh      tool-wrapper.sh 

#startup.sh 启动tomcat | shutdown.sh 关闭tomcat

移动jenkins.war到tomcat目录/usr/local/tomcat/webapps,会自动生成一个jenkins文件夹,生成后移除jenkins.war包

mv /usr/lib/jenkins.war /usr/local/tomcat/webapps

等jenkins目录生成后

mv /usr/local/tomcat/webapps/jenkins.war /tmp

删除tomcat的ROOT目录并且把jenkins目录更改为ROOT

rm -rf /usr/local/tomcat/webapps/ROOT
mv /usr/local/tomcat/webapps/jenkins /usr/local/tomcat/webapps/ROOT

重启tomcat

/usr/local/tomcat/bin/shutdown.sh
/usr/local/tomcat/bin/startup.sh

登入你的网页

192.168.142.106:8585

在这里插入图片描述

根据窗口发现。tomcat默认启动的jenkins目录在/root/.jenkins

在这里插入图片描述

关闭tomcat,把之前的所有数据全部移动到/root/.jenkins目录下(最好先删除)

关闭tomcat

/usr/local/tomcat/bin/shutdown.sh
rm -rf /root/.jenkin/*(最好先删除/root/.jenkin所有文件)

移动之前所有数据到此目录下

\mv /var/lib/jenkins/* /root/.jenkin/

启动tomcat,发现所有数据都回来了(包含用户账号,秘钥文件,任务,构建日志等等)

在这里插入图片描述

<think>首先,用户的问题是:“我想查找在Linux环境下先杀死原有运行进程启动war的方法。” 我需要基于提供的站内引用来回答这个问题。引用括脚本示例、Linux命令等。 关键点是: - 用户想杀死原有的运行进程(可能与war相关)。 - 然后启动war。 从提供的引用中: - 引用[1]:关于关闭Jenkins的脚本,使用`ps -ef |grep -v grep | grep jenkins | awk '{print $2}' | xargs kill -s 9`来杀死Jenkins进程。这展示了如何找到并杀死特定进程。 - 引用[2]:涉及删除文件,但不太相关。 - 引用[3]:Linux问题排查命令括`ps`、`find`、`netstat`等。提到了`ps`显示进程状态。 - 引用[4]:详细介绍`ps`命令选项,如`-ef`显示所有进程。 用户可能是在运行Java Web应用,比如Tomcat或类似容器启动warwar通常部署在Java应用服务器上,如Tomcat或JenkinsJenkins本身就是一个war)。 步骤应该是: 1. 找到并杀死原有的进程(比如Tomcat或Jenkins进程)。 2. 启动新的war(比如通过Java命令启动脚本)。 从引用[1],我可以直接使用类似脚本查找并杀死进程。对于war,通常是通过`java -jar app.war`或部署到Tomcat。 我需要构建一个脚本: - 第一部分:查找并杀死进程使用`ps -ef | grep <process_name> | grep -v grep | awk '{print $2}' | xargs kill -9`。 - 第二部分:启动war,比如`java -jar app.war`或`./catalina.sh start` for Tomcat。 进程名称:用户提到“war”,所以我假设war运行在Java进程中。常见进程括`java`或特定应用名如`tomcat`。 为了通用性,我可以假设用户想杀死与特定jar/war相关的进程,然后启动它。 基于引用: - 使用`ps -ef | grep`来查找进程。 - 使用`kill -9`强制杀死(从引用[1])。 - 然后启动war启动warwar通常不是直接执行,而是部署在容器中。例如: - 对于Tomcat,war放在`webapps`目录。 - 或者直接运行`java -jar app.war`如果是一个可执行war。 在回答中,我应该提供脚本示例。 现在,系统级指令: - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,如[^1]。 - 对于数学表达式,用$...$或$$...$$,但这个问题可能不涉及数学,所以可能不需要。 - 结构清晰,逐步解决问题。 回答结构: 1. **简介**:解释步骤。 2. **步骤细节**: - 如何查找进程。 - 如何杀死进程。 - 如何启动war。 3. **脚本示例**:提供一个完整的shell脚本。 4. **注意事项**:比如确保安全杀死进程,备份等。 5. **相关问题**:基于用户查询生成相关问题。 引用标识:我需要引用提供的引用。例如: - 当提到杀死进程时,引用[1]中的脚本。 - 当提到`ps`命令时,引用[3]或[4]。 用户查询是“先杀死原有运行进程启动war”,所以我应该专注于这个。 最终脚本思路: - 查找Java进程或特定进程名。 - 杀死它。 - 启动新的war。 例如: ```bash #!/bin/bash # Kill existing process pkill -f "java.*war" || true # 或者使用ps/grep/kill组合 # Start new war java -jar /path/to/app.war ``` 但使用pkill可能更简单,但引用中用了ps/grep/kill,所以我应该使用那个以匹配引用。 从引用[1]: ```bash ps -ef |grep -v grep | grep jenkins | awk '{print $2}' | xargs kill -s 9 ``` 类似地,我可以修改为查找与war相关的进程进程名:可能是`java`或特定名。用户需要指定进程名或jar名。 在脚本中,用户可以自定义进程名。 完整脚本示例: ```bash #!/bin/bash # Define process name (e.g., the jar name or keyword to grep) PROCESS_NAME="myapp.war" # Find and kill existing process ps -ef | grep -v grep | grep "$PROCESS_NAME" | awk '{print $2}' | xargs kill -9 >/dev/null 2>&1 # Wait a bit for graceful shutdown if needed sleep 2 # Start the war application java -jar /path/to/$PROCESS_NAME > /path/to/logfile.log 2>&1 & ``` 注意事项: - `kill -9`是强杀,可能不优雅;理想情况下,先用普通kill,然后强杀。 - 添加等待时间。 - 启动命令可能需要更多参数,如端口等。 生成相关问题: - 基于用户查询,相关问题如: 1. 如何优雅地杀死进程而不是使用kill -9? 2. 如何确保war启动成功? 3. 如何自动化部署括备份? 4. 常见问题排查如端口冲突。 确保回答真实可靠:基于标准Linux实践。 现在,写回答。 </think>### Linux环境下先杀死原有运行进程启动war的方法 在Linux环境下,如果您需要先杀死原有的运行进程(如Java Web应用进程),然后再启动新的war,这通常涉及查找特定进程、强制终止它,最后执行war启动命令。这个过程可以通过编写一个shell脚本来实现,以确保操作自动化、可靠。下面我将基于您提供的站内引用(特别是引用[1]和引用[4]中的命令)逐步解释方法,并提供完整脚本示例。 #### 步骤详解 1. **查找原有进程**: 使用`ps -ef`命令(显示所有进程信息)结合`grep`过滤出与war相关的进程war通常由Java进程运行(如`java -jar app.war`),所以您需要指定一个关键字(如war文件名或应用名)来搜索进程。 - 示例命令: `ps -ef | grep -v grep | grep "myapp.war"` - `ps -ef`:显示所有进程的完整信息,括PID(进程ID)[^4]。 - `grep -v grep`:排除`grep`命令本身的进程行,避免误杀。 - `grep "myapp.war"`:过滤出含关键字(如war文件名)的进程行。 - 输出进程PID,用于后续kill操作。 2. **杀死原有进程**: 使用`awk`提取PID,然后通过`xargs kill -s 9`强制终止进程(`-s 9`表示SIGKILL信号,确保进程立即结束)。 - 示例命令: `ps -ef | grep -v grep | grep "myapp.war" | awk '{print $2}' | xargs kill -s 9` - `awk '{print $2}'`:提取第二列(即PID)。 - `kill -s 9`:强制终止进程,类似于`kill -9`,确保进程被彻底杀死[^1]。 - 注意:`kill -9`是强杀方式,可能不优雅(例如,未保存数据)。如果进程支持优雅关闭,建议先尝试普通kill(如`kill -15`),但在脚本中为确保终止,常使用`-9`。 3. **启动war**: 杀死进程后,使用Java命令启动war(需确保Java环境已安装)。war通常通过`java -jar`运行,或部署到应用服务器(如Tomcat)。 - 示例命令: `java -jar /path/to/myapp.war > /path/to/logfile.log 2>&1 &` - `> /path/to/logfile.log 2>&1`:将输出和错误重定向到日志文件,便于排查问题[^3]。 - `&`:后台运行进程,避免阻塞脚本。 4. **添加等待和错误处理**: 在杀死和启动之间添加`sleep`命令(如2秒),给系统缓冲时间。使用`|| true`忽略可能的错误(如进程不存在时kill失败)。 #### 完整脚本示例 以下是一个可定制的shell脚本示例。请保存为文件(如`restart_war.sh`),并使用`chmod +x restart_war.sh`赋予执行权限。运行方式:`./restart_war.sh`。 ```bash #!/bin/bash # 定义变量:根据您的实际路径和war文件名修改 WAR_FILE="myapp.war" # 替换为您的war文件名(如app.warWAR_PATH="/path/to/$WAR_FILE" # 替换为war的完整路径(如/home/user/app.war) LOG_PATH="/path/to/logfile.log" # 替换为日志文件路径(如/home/user/war.log) # 步骤1:查找并杀死原有进程 echo "查找并杀死已有进程..." ps -ef | grep -v grep | grep "$WAR_FILE" | awk '{print $2}' | xargs kill -s 9 >/dev/null 2>&1 || true # 等待2秒,确保进程完全终止 sleep 2 # 步骤2:启动war echo "启动war: $WAR_PATH" java -jar "$WAR_PATH" > "$LOG_PATH" 2>&1 & echo "操作完成!请检查日志: $LOG_PATH" ``` #### 注意事项 - **安全性**:`kill -s 9`是强制终止,可能导致数据丢失。如果应用支持,建议先尝试优雅停止(如通过应用自带的停止脚本)。测试时,可以先运行`ps -ef | grep "myapp.war"`手动确认PID,避免误杀[^4]。 - **环境要求**:确保Java环境已安装(检查命令:`java -version`)。war必须是可执行的(如Spring Boot的fatjar),否则需集成到Tomcat中。 - **错误排查**: - 如果启动失败,检查日志文件(如`cat /path/to/logfile.log`)。 - 使用`netstat -ntpl | grep <port>`检查端口占用(如8080),避免冲突[^3]。 - 确保路径正确:如果路径错误,脚本可能无法找到文件。 - **扩展优化**: - 添加备份:在重启前备份旧war(如`cp $WAR_PATH $WAR_PATH.bak`),引用[2]中的`rm`命令可用于清理旧文件。 - 优雅停止:集成应用的自带停止命令(如Tomcat的`shutdown.sh`)。 这个方法基于标准Linux命令,可靠性高,适用于大多数Java Web应用部署场景[^1][^3][^4]。如果您有特定环境细节,可以提供更多信息进行优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值