應用背景
希望通過shell腳本去靈活地啓動,關閉,重啓jar包程序,且可以查看當前程序運行狀態。這樣可以提高運維效率,便於管理。
如執行如下命令,啓動java程序:
sh /home/zzworld/software_rel/softexe/javaweb_bin/start_java_test-web-all.sh start
shell腳本代碼
#!/bin/bash
#description: 啓動重啓server服務
#獲取時間: yyyy-mm-dd
day_id=$(date '+%Y-%m-%d')
#應用名稱,根據此名稱確定PID
exe_name='test-web-all.jar'
#環境
env_the='prod'
#應用所在目錄
HOME='/home/zzworld/software_rel/softexe/javaweb'
#log日誌
log_name=${exe_name%.*}
log_dir="/home/zzworld/software_rel/softexe/javaweb_log/${log_name}/zz_${log_name}_${day_id}.log"
#查詢應用pid,(ps是進程狀態信息)
pid=`ps -elf |grep $exe_name|grep -v grep |head -n 1 |awk '{printf $4}'`
#通過pid獲取端口號,(netstat,是網絡連接相關信息,如套接字,端口,pid/應用名,等等)
port=`netstat -anopt |grep $pid|head -n 1|awk '{printf $4}'|cut -d: -f4`
start(){
if [ -n "$pid" ];
then
echo "server already start,pid:$pid"
return 0
fi
#進入命令所在目錄
echo "jar:$HOME/$exe_name ; log: $log_dir"
cd $HOME
nohup java -jar $HOME/$exe_name --spring.profiles.active=$env_the >> $log_dir 2>&1 & #啓動程序, 把日誌輸出到log_dir文件
#查詢應用pid,(ps是進程狀態信息)
pid=`ps -elf |grep ${exe_name}|grep -v grep |head -n 1 |awk '{printf $4}'`
#sleep 15s
#通過pid獲取端口號,(netstat,是網絡連接相關信息,如套接字,端口,pid/應用名,等等)
port=`netstat -anopt |grep ${pid}|head -n 1|awk '{printf $4}'|cut -d: -f4`
echo "start at port:${port},pid:$pid"
}
stop(){
if [ -z "$pid" ]; then
echo "not find program on port:$port"
return 0
fi
#結束程序,使用訊號2,如果不行可以嘗試訊號9強制結束
kill -9 $pid
rm -rf $pid
echo "kill program use signal 2,pid:$pid"
}
status(){
if [ -z "$pid" ]; then
echo "not find program on port:$port"
else
echo "program is running,pid:$pid"
fi
}
case $1 in
start)
start
;;
stop)
stop
;;
restart)
$0 stop
sleep 2
$0 start
;;
status)
status
;;
*)
echo "Usage: {start|stop|status}"
;;
esac
exit 0
腳本說明
- 先通過時間函數
$(date '+%Y-%m-%d')
獲取當前日期day_id,從而輸出啓動日誌到程序對應地日誌文件。 - 定義基礎變量,如 腳本環境:env_the,根目錄 home等等。
- 獲取當前程序的pid:
ps -elf |grep $exe_name|grep -v grep |head -n 1 |awk '{printf $4}'
(參考:ps -elf 查看進程獲取進程id) - 獲取程序啓動後的端口:
netstat -anopt |grep $pid|head -n 1|awk '{printf $4}'|cut -d: -f4
(參考:netstat -anp |awk |cut 通過pid獲取應用程序的端口號) - start()方法,表示啓動,其中先判斷pid不爲空,之後執行
nohup java -jar $HOME/$exe_name --spring.profiles.active=$env_the >> $log_dir 2>&1 &
指令,
$HOME表示引用變量值,–spring是傳入程序的參數,>>是重定向追加輸出內容到目錄log_dir,2>$1
意思是將2
表示的錯誤流也定向到1
對應的標準流中,最後一個$
表示把該命令放到後臺執行。 - stop()方法是通過上述獲取的pid去 kill 該程序。
- status()方法是判斷該程序是否執行。
- 腳本
case $1 in
是switch選擇函數,通過執行命令傳入不同參數start,stop,status,restart來表示啓動,停止,查詢狀態,重啓。 - 最後
exit 0
退出腳本