还在手动启动Java程序?Linux设置开机自启动Java脚本启动Java程序

您所在的位置:网站首页 把一个程序设置开机启动盘 还在手动启动Java程序?Linux设置开机自启动Java脚本启动Java程序

还在手动启动Java程序?Linux设置开机自启动Java脚本启动Java程序

2024-03-19 18:22| 来源: 网络整理| 查看: 265

Linux设置开机自启动Java脚本程序 缘起

公司内部的服务器中有个SpringCloud项目需要运行,之前都是通过nohup java-jar .. &的命令来执行的,但是这个cloud项目服务太多,手动启动太麻烦而且容易出错,干脆写个执行java的脚本好了,后面服务器意外宕机,再启动时还需要手动执行脚本,再设置个开机自启动。

实现 psmisc工具

本脚本中使用了killall命令来删除所有正在执行的java进程,那么需要先把一个工具安装下(这个工具提供了3个命令来简化我们的操作,比较实用),如果你的项目脚本中无需这个killall命令,可跳过此段落。

提供了3个实用性命令:

pstree:以树状形式显示当前用户下正在运行的进程fuserkillall:杀进程用的 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程序 do ti2=`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" ]] do ti2=`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" ]] do ti2=`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程序 do ti2=`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" ]] do ti2=`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" ]] do ti2=`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


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3