Linux 设置java jar包开机自启
转自:https://betheme.net/dashuju/11365.html?action=onClick
其他相关博客:
1.https://blog.csdn.net/sinat_24985411/article/details/129552951
2.https://blog.csdn.net/weixin_68100450/article/details/127294653?ops_request_misc=&request_id=&biz_id=102&utm_term=Linux%E5%BC%80%E6%9C%BA%E8%87%AA%E5%90%AFjar%E5%8C%85&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-3-127294653.142^v86^control,239^v2^insert_chatgpt&spm=1018.2226.3001.4187
3.https://blog.csdn.net/bbg221/article/details/78361246?locationNum=4&fps=1
4.https://blog.csdn.net/qq_43836796/article/details/127100712?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168370886916800197040368%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=168370886916800197040368&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~baidu_landing_v2~default-4-127100712-null-null.142^v86^control,239^v2^insert_chatgpt&utm_term=Linux%E5%BC%80%E6%9C%BA%E8%87%AA%E5%90%AFjar%E5%8C%85&spm=1018.2226.3001.4187
5.https://blog.csdn.net/weixin_44431073/article/details/124981139?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168370886916800197040368%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=168370886916800197040368&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~baidu_landing_v2~default-3-124981139-null-null.142^v86^control,239^v2^insert_chatgpt&utm_term=Linux%E5%BC%80%E6%9C%BA%E8%87%AA%E5%90%AFjar%E5%8C%85&spm=1018.2226.3001.4187
6.https://blog.csdn.net/lililidahaoren/article/details/122706476?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168370886916800197040368%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=168370886916800197040368&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-2-122706476-null-null.142^v86^control,239^v2^insert_chatgpt&utm_term=Linux%E5%BC%80%E6%9C%BA%E8%87%AA%E5%90%AFjar%E5%8C%85&spm=1018.2226.3001.4187
实现
psmisc工具
本脚本中使用了killall
命令来删除所有正在执行的java进程,那么需要先把一个工具安装下(这个工具提供了3个命令来简化我们的操作,比较实用),如果你的项目脚本中无需这个killall命令,可跳过此段落
。
提供了3个实用性命令:
- pstree:以树状形式显示当前用户下正在运行的进程
- fuser
- killall:杀进程用的
yum -y install psmisc
安装完毕后,即可使用killall
命令了
脚本文件
restart.sh
#!/bin/bash
source /etc/profile
killall -9 java # 杀掉所有的java程序
nohup java -jar ms-config-2.0-SNAPSHOT.jar &
ti1=`date +%s` #获取时间戳(单位是s)
ti2=`date +%s`
i=$(($ti2 - $ti1 ))
while [[ "$i" -ne "15" ]] # 不停循环,直到15s后,执行下一个java程序
doti2=`date +%s`i=$(($ti2 - $ti1 ))
done
nohup java -jar ms-eureka-1.0-SNAPSHOT.jar &
ti1=`date +%s` #获取时间戳
ti2=`date +%s`
i=$(($ti2 - $ti1 ))
while [[ "$i" -ne "15" ]]
doti2=`date +%s`i=$(($ti2 - $ti1 ))
done
nohup java -jar flower-ms-dfs-1.0-SNAPSHOT.jar &
ti1=`date +%s` #获取时间戳
ti2=`date +%s`
i=$(($ti2 - $ti1 ))
while [[ "$i" -ne "15" ]]
doti2=`date +%s`i=$(($ti2 - $ti1 ))
done
文件解读:
以3个服务为例,先刷新下环境变量,然后杀掉所有启动的Java程序,然后执行nohup java -jar ... &
启动java程序,15s后再去启动第二个java程序,以此类推,内容非常简单。
方式一
-
先编写好sh运行的脚本命令,如上面的
restart.sh
文件,需要注意的一点是,上面的restart.sh
文件中,第二行要记得# chkconfig: 345 99 10
,当Linux开机启动后,将执行我们自定义的脚本命令 -
将脚本执行文件放到
/etc/init.d
目录下mv ./restart.sh /etc/init.d/
-
给
restart.sh
文件添加可执行权限chmod 777 restart.sh
-
注册我们的脚本命令
chkconfig --add restart.sh
文件中一定要记得写**# chkconfig**的内容,否则注册时会报错。
完整的脚本文件贴出来
#!/bin/bash
# chkconfig: 345 99 10
source /etc/profile
killall -9 java # 杀掉所有的java程序
# 执行时记得找到自己jar包的全路径
nohup java -jar /home/myapp/ms-config-2.0-SNAPSHOT.jar &
ti1=`date +%s` #获取时间戳(单位是s)
ti2=`date +%s`
i=$(($ti2 - $ti1 ))
while [[ "$i" -ne "15" ]] # 不停循环,直到15s后,执行下一个java程序
doti2=`date +%s`i=$(($ti2 - $ti1 ))
done
nohup java -jar /home/myapp/ms-eureka-1.0-SNAPSHOT.jar &
ti1=`date +%s` #获取时间戳
ti2=`date +%s`
i=$(($ti2 - $ti1 ))
while [[ "$i" -ne "15" ]]
doti2=`date +%s`i=$(($ti2 - $ti1 ))
done
nohup java -jar /home/myapp/flower-ms-dfs-1.0-SNAPSHOT.jar &
ti1=`date +%s` #获取时间戳
ti2=`date +%s`
i=$(($ti2 - $ti1 ))
while [[ "$i" -ne "15" ]]
doti2=`date +%s`i=$(($ti2 - $ti1 ))
done
完毕后,重启服务器尝试即可。
方式二
- Linux系统启动时需要加
/etc/profile
、/etc/bashrc
、/etc/rc.d/rc.local
等配置文件,我们可以在/etc/rc.d/rc.local
文件中写入我们要执行的命令、或者我们将要执行的脚本写入即可。如例子:
-
修改文件执行权限
chmod +x /etc/rc.d/rc.local
重启服务器尝试即可。
方式三(推荐使用)
使用方式
自定义服务文件,添加到系统服务中,通过systemctl
进行管理
-
在
/usr/lib/systemd/system/
目录下新建一个文件,如app.service
文件注意文件中的所有地方都要用
绝对路径
来写,否则报错。[Unit] Description=Process Monitoring and Control Daemon After=rc-local.service nss-user-lookup.target[Service] Type=forking ExecStart=/root/20220921restart.sh PrivateTmp=True[Install] WantedBy=multi-user.target
-
完成后,可以用
systemctl
命令进行管理了systemctl start app # 启动app服务 systemctl status app # 查看app服务状态 systemctl enable app # 开机自启动 app systemctl disable app # 关闭开机自启动 app# 列出所有开机自启动的服务 systemctl list-unit-files --type=service | grep enabled
文件各配置详解
[Unit]区块:
- Description : 服务描述
- After:表示在某些服务启动后启动
- Before字段:定义xxx.service应该在哪些服务之前启动。
[Service]区块:注意全部要用绝对路径!!!
-
ExecStart字段:定义启动进程时执行的命令
-
ExecReload字段:重启服务时执行的命令
-
ExecStop字段:停止服务时执行的命令
-
ExecStartPre字段:启动服务之前执行的命令
-
ExecStartPost字段:启动服务之后执行的命令
-
ExecStopPost字段:停止服务之后执行的命令
-
Type :启动类型:
- forking:ExecStart字段将以fork()方式启动,此时父进程将会退出,子进程将成为主进程(后台运行)
- simple(默认值):ExecStart字段启动的进程为主进程
- oneshot:类似于simple,但只执行一次,Systemd 会等它执行完,才启动其他服务
[Install]区块:
-
WantedBy:表示该服务所在的 Target。
WantedBy=multi-user.target指的是:sshd 所在的 Target 是multi-user.target。
这个设置非常重要,因为执行systemctl enable sshd.service命令时,sshd.service的一个符号链接,就会放在/etc/systemd/system目录下面的multi-user.target.wants子目录之中。
总结:
方式三管理地更加全面一点,可以用systemctl
来进行管理,当然配置也就较为麻烦点,实际可以根据自己的业务场景来做,我这边有一个场景:一个springcloud项目中有一些服务是用脚本命令来进行管理的,有一部分是通过linux的supervisor
进程管理工具来进行管理的,脚本那些管理的都是服务所需的配置、注册中心之类的,必须要在supervisor
管理的程序执行前执行,那么我就可以使用第三种方式,且在[Unit]区块中配置Before命令,例子
[Unit]
Description=Process Monitoring and Control Daemon
Before=supervisord.service[Service]
Type=forking
ExecStart=/root/20220921restart.sh
PrivateTmp=True[Install]
WantedBy=multi-user.target
在网上查询资料写的脚本记录:
方式一:
1.写脚本(脚本文件最好是vi 或 vim新建出来的,直接粘贴可能会出现未知的问题其中webServerPath是定义的常量可有可无,也可以不写改成具体路径,nohup.out是日志输出):
#/bin/bash
source /etc/profile # 刷新环境变量
# 定义服务路径
webServerPath=/data/web
# 启动自定义服务(两个)
nohup java -jar $webServerPath/rbpsems-web-2.0.0-SNAPSHOT-boot.jar >$webServerPath/nohup.out 2>&1 &
nohup java -jar /data/lv/forward-lvfu-0.0.1-SNAPSHOT.jar >/data/lv/nohup.out 2>&1 &
2. 在 /etc/rc.d路径下修改rc.local配置文件,添加开机运行脚本命令即可,脚本位置要改成自己的:
sh /data/ke/st.sh
按照上面的步骤确实可以成功启动jar包,但是有一些问题,和一些可以优化的地方>>>
(1)存在的问题:
1. 按照上面的脚本指令启动的jar包会使用jar包内自己打好的配置文件application.yml,这个可以解压jar后在 /BOOT-INF/classes 路径下查看jar包内的配置文件,
如果启动时使用jar包自带的配置文件而非外部的配置文件,那么jar包同路径下的外部的配置文件application.yml就不起作用了,这样启动的端口和配置文件中的
一些配置就不一致了,会导致一些端口冲突、配置不一致以及jar起不来的问题。
>>>解决方法:在脚本中先cd到jar包的目录后再执行jar包
eg:将 nohup java -jar /data/lv/forward-lvfu-0.0.1-SNAPSHOT.jar &
改为:cd /data/lv/
nohup java -jar forward-lvfu-0.0.1-SNAPSHOT.jar &
这样就可以了。
(2)可以优化的地方:
1.上面的脚本中指定日志的命令可以省略eg:>/data/lv/nohup.out 2>&1 & 省略后默认也是会输出nohup.out名称的日志的。
2.脚本的第二行是指定java环境的:source /etc/profile # 刷新环境变量
如果你是使用安装命令下载的jdk的话,这行就可以去掉,如果是使用压缩文件解压的jdk然后在/etc/profile文件里面配置的
java环境的话,要加上这行命令,否则在开机执行时有可能加载不到java环境,导致启动jar包失败。
===============================================
优化后的脚本终版:
#/bin/bash
source /etc/profile
cd /data/ke/web/
nohup java -jar aaa.jar &
cd /data/ke/plat/
nohup java -jar bbb.jar &
cd /data/ke/pl/
nohup java -jar ccc.jar &
上面是启动了三个jar包
===============================================
方式二:
1. 编写脚本
2. 脚本里添加# chkconfig: 345 99 10命令
3. 将编写的脚本执行文件放到/etc/init.d
目录下:
mv ./start.sh /etc/init.d/
或者
cp start.sh /etc/init.d
4. 给restart.sh
文件添加可执行权限:
chmod 777 restart.sh
5. 注册脚本:
chkconfig --add restart.sh
注意:文件中一定要记得写**# chkconfig**的内容,否则注册时会报错。
示例脚本如下:
===============================================
#!/bin/bash
# chkconfig: 345 99 10
source /etc/profile
cd /home/httpTest
nohup java -jar httpPost-0.0.1-SNAPSHOT.jar &
cd /home
nohup java -jar wisdom-web.jar &
===============================================
第二种方式不需要修改rc.local文件。
1.编写脚本
2.将编写好的脚本执行文件放到/etc/rc.d/init.d目录下:
cp /data/keshe/start.sh /etc/rc.d/init.d
3.给start.sh文件添加可执行权限:
chmod 777 /etc/rc.d/init.d/start.sh
4. 注册脚本:
①chkconfig --add start.sh
②chkconfig start.sh on
5.启动脚本服务的2、3、4、5、6运行等级
chkconfig --level 23456 start.sh on
# chkconfig: 345 99 10
source /etc/profile
cd /data/keshe/web/ && nohup /data/jdk/jdk1.8.0_261/bin/java -jar rbpsems-web-2.0.0-SNAPSHOT-boot.jar >nohup.out &
sleep 10
cd /data/keshe/wuqing/ && nohup /data/jdk/jdk1.8.0_261/bin/java -jar forward-wuqing-2.0.0-SNAPSHOT-boot.jar >nohup.out &
sleep 10
cd /data/keshe/kepiao/ && nohup /data/jdk/jdk1.8.0_261/bin/java -jar things-router-platform.jar >nohup.out &
sleep 10
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示