我们在通过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
## 启动所有
./start.sh start all
## 停止所有
./start.sh stop all
## 重启所有
./start.sh restart all
## 启动某一个 这里的gateway与sh中的module中定义的一样即可
./start.sh restart gateway
# 编辑自启管理文件
vim /etc/rc.d/rc.local
# 写入脚本存放路径
/home/process_parent/start.sh
# 重启系统
reboot
crontab 是 Linux 下的计划任务,当时间达到我们设定的时间时,可以自动触发某些脚本的运行。
# 进入crontab管理
crontab -e
# 添加需要被管理的项目
@reboot /home/process_parent/start.sh
# 重启系统
reboot
本方法仅适用于 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、启动命令,发现正常启动,至此完毕