linux环境中一次启动多个jar包,并且设置脚本开机自启

如果你不相信努力和时光,那么成果就会是第一个选择辜负你的。不要去否定你自己的过去,也不要用你的过去牵扯你现在的努力和对未来的展望。不是因为拥有希望你才去努力,而是去努力了,你才有可能看到希望的光芒。linux环境中一次启动多个jar包,并且设置脚本开机自启,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

1、编写启动脚本

我们在通过jar启动项目时,有时候会比较多,启动会比较麻烦,需要编写shell脚本启动,将启动脚本存放在需要启动的jar包路径下。(文档存放在 /home/process_parent )

vim start.sh
#! /bin/sh
# 端口号
PORTS=(9527 8004 8005 8001)
# 模块
MODULES=(process-gateway process-activiti process-auth process-system)
# 模块名称
MODULE_NAMES=(网关 流程配置中心 用户登录 数据管理)
# jar包数组
JARS=(process-gateway-1.0.0-SNAPSHOT.jar process-activiti-0.0.1-SNAPSHOT.jar process-auth-1.0.0-SNAPSHOT.jar process-system-1.0.0-SNAPSHOT.jar)
# jar包路径
JAR_PATH='/home/process_parent'
# 日志路径
LOG_PATH='/home/process_parent/logs'
start() {
local MODULE=
local MODULE_NAME=
local JAR_NAME=
local command="$1"
local commandOk=0
local count=0
local okCount=0
local port=0
for((i=0;i<${#MODULES[@]};i++))
do
MODULE=${MODULES[$i]}
MODULE_NAME=${MODULE_NAMES[$i]}
JAR_NAME=${JARS[$i]}
PORT=${PORTS[$i]}
if [ "$command" == "all" ] || [ "$command" == "$MODULE" ];then
commandOk=1
count=0
PID=`ps -ef |grep $(echo $JAR_NAME | awk -F/ '{print $NF}') | grep -v grep | awk '{print $2}'`
if [ -n "$PID" ];then
echo "$MODULE---$MODULE_NAME:已经运行,PID=$PID"
else
exec nohup java -Xms256m -Xmx512m -jar $JAR_PATH/$JAR_NAME >> $LOG_PATH/$MODULE.log 2>&1 &
PID=`ps -ef |grep $(echo $JAR_NAME | awk -F/ '{print $NF}') | grep -v grep | awk '{print $2}'`
while [ -z "$PID" ]
do
if (($count == 30));then
echo "$MODULE---$MODULE_NAME:$(expr $count \* 10)秒内未启动,请检查!"
break
fi
count=$(($count+1))
echo "$MODULE_NAME启动中.................."
sleep 10s
PID=`ps -ef |grep $(echo $JAR_NAME | awk -F/ '{print $NF}') | grep -v grep | awk '{print $2}'`
done
okCount=$(($okCount+1))
echo "$MODULE---$MODULE_NAME:已经启动成功,PID=$PID"
fi
fi
done
if(($commandOk == 0));then
echo "第二个参数输入错误"
else
echo "............本次共启动:$okCount个服务..........."
fi
}

stop() {
local MODULE=
local MODULE_NAME=
local JAR_NAME=
local command="$1"
local commandOk=0
local okCount=0
for((i=0;i<${#MODULES[@]};i++))
do
MODULE=${MODULES[$i]}
MODULE_NAME=${MODULE_NAMES[$i]}
JAR_NAME=${JARS[$i]}
if [ "$command" = "all" ] || [ "$command" = "$MODULE" ];then
commandOk=1
PID=`ps -ef |grep $(echo $JAR_NAME | awk -F/ '{print $NF}') | grep -v grep | awk '{print $2}'`
if [ -n "$PID" ];then
echo "$MODULE---$MODULE_NAME:准备结束,PID=$PID"
kill -9 $PID
PID=`ps -ef |grep $(echo $JAR_NAME | awk -F/ '{print $NF}') | grep -v grep | awk '{print $2}'`
while [ -n "$PID" ]
do
sleep 3s
PID=`ps -ef |grep $(echo $JAR_NAME | awk -F/ '{print $NF}') | grep -v grep | awk '{print $2}'`
done
echo "$MODULE---$MODULE_NAME:成功结束"
okCount=$(($okCount+1))
else
echo "$MODULE---$MODULE_NAME:未运行"
fi
fi
done
if (($commandOk == 0));then
echo "第二个参数输入错误"
else
echo "............本次共停止:$okCount个服务............"
fi
}


case "$1" in
start)
start "$2"
;;
stop)
stop "$2"
;;
restart)
stop "$2"
sleep 3s
start "$2"
;;
*)
echo "第一个参数请输入:start|stop|restart"
exit 1
;;
esac

需要修改的地方如下,其他地方不变:

PORTS 端口号,多个用空格隔开
MODULES 模块,多个用空格隔开
MODULE_NAMES 模块名称,多个用空格隔开
JARS jar包数组,多个用空格隔开
JAR_PATH jar包路径,多个用空格隔开
LOG_PATH 日志路径,多个用空格隔开

编写成功后,修改文件的权限

chmod +7 start.sh

2、启动脚本

## 启动所有
./start.sh start all
## 停止所有
./start.sh stop all
## 重启所有
./start.sh restart all
## 启动某一个 这里的gateway与sh中的module中定义的一样即可
./start.sh restart gateway

3、设置脚本开机自启

方式一:修改 /etc/rc.d/rc.local 文件

# 编辑自启管理文件
vim /etc/rc.d/rc.local

# 写入脚本存放路径
/home/process_parent/start.sh

# 重启系统
reboot

方法二:使用 crontab

crontab 是 Linux 下的计划任务,当时间达到我们设定的时间时,可以自动触发某些脚本的运行。

# 进入crontab管理
crontab -e

# 添加需要被管理的项目
@reboot /home/process_parent/start.sh

# 重启系统
reboot

方法三:使用 systemd 服务

本方法仅适用于 systemd 系统。如何区分是不是 systemd 系统?很简单,只需运行 ps aux 命令,查看 pid 为 1 的进程是不是 systemd
在这里插入图片描述
创建的 systemd 启动服务如下。请注意,这时后缀是 .service ,而不是 .sh

vim /etc/systemd/system/start.service

在start.service写入以下内容

[Unit]
Description=Run a Custom Script at Startup
After=default.target

[Service]
ExecStart=/home/process_parent/start.sh

[Install]
WantedBy=default.target

更新 systemd 配置文件

systemctl daemon-reload

systemctl enable start.service

重启系统

reboot

坑点

如果使用启动脚本报:bad interpreter:No such file or directory的错误
在这里插入图片描述
原因:.sh脚本在windows系统下编写的,所以可能有不可见字符,从上图错误提示来看,很有可能脚本文件是DOS格式的,即每一行的行尾以\r\n来标识, 其ASCII码分别是0x0D, 0x0A。

解决办法:
1、通过vim filename 或者vi filename 进入编辑,即我这是vim startup_heartbeat.sh
在这里插入图片描述
2、然后通过shift+:进入命令模式。接着通过命令set ff 或者 set fileformat 查看文件格式,即我这如下图:从中可以看到我这文件格式是dos
在这里插入图片描述
在这里插入图片描述
3、修改文件格式dos为unix。通过命令set ff=unix 或 set fileformat=unix修改,然后再执行set ff 或者 set fileformat,查看是否修改成功。即如下图所示:
在这里插入图片描述
在这里插入图片描述
4、启动命令,发现正常启动,至此完毕
在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/202815.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!