linux中一次啟動多個jar的腳本


我們在通過jar啟動項目時,有時候會比較多,啟動會比較麻煩,需要編寫shell腳本啟動,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'
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

編寫成功后,修改文件的權限chmod +7 start.sh
操作的命令:

## 啟動所有
./start.sh start all
## 停止所有
./start.sh stop all
## 重啟所有
./start.sh restart all
## 啟動某一個 這里的gateway與sh中的module中定義的一樣即可
./start.sh restart gateway

如果啟動報:bad interpreter:No such file or directory的錯誤

 

 

 原因:

1).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)啟動命令,發現正常啟動,至此完畢。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM