我們在通過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)啟動命令,發現正常啟動,至此完畢。
