Linux Java 應用重啟腳本
- 本文主要是介紹腳本的實現(xiàn)介粘,以及給一些先自動化優(yōu)雅處理 Java 應用重啟的同學帶來一些幫助
- 一般直接啟動 java 應用時候都是需要手打命令后臺啟動應用幔烛,通過
ps -ef
查找進程kill
或者kill -9
應用 ,這樣繁瑣的操作不想每次都去做胚膊,想自動化實現(xiàn),這個腳本可能就是滿足你的需求了 - 如果是使用
docker
容器或者其他一些容器化的工具揖膜,這個文章可能就不合適了疮蹦,因為那些工具有更加強好用的實現(xiàn)方式
shell 腳本
#!/bin/bash
for service_name in "$@"; do
app="$service_name.jar"
# 配置信息
# jar 啟動路徑(選填,不包含 **.jar eg:/home/java) 盡量避免誤殺進程,建議寫路徑否副,否則取當前目錄
jar_path=
# jar 啟動參數(shù)(選填)
java_opts="-Xms350m -Xmx350m"
# 啟動參數(shù)追加(選填)
append_params=
# 最大等待次數(shù)
max_wait_times=3
# 每隔多少秒執(zhí)行一次 kill 命令
kill_wait_time=10
# 該程序有多個進程正在運行汉矿,則僅查找最老的,即最先啟動的(多個進程時即父進程PID)
if [ -z "$jar_path" ] || [ "." = "$jar_path" ]; then
grep_app_param=$app
else
grep_app_param=$jar_path/$app
fi
pid=$(pgrep -of $grep_app_param)
process_count=$(pgrep -f $grep_app_param | wc -l)
# 當前等待次數(shù)
wait_times=0
echo "當前應用[$service_name]存在數(shù)量:[$process_count]"
if [ "$process_count" != 0 ]; then
while [ "$process_count" != 0 ] && [ "$wait_times" -lt "$max_wait_times" ]; do
wait_times=$((wait_times + 1))
echo "第 $wait_times 次停止應用:[$service_name],pid:[$pid],剩余進程數(shù):[$process_count],請稍等 $kill_wait_time s ..."
kill "$pid"
sleep $kill_wait_time
process_count=$(pgrep -f $grep_app_param | wc -l)
done
echo "應用已停止:[$service_name]"
else
echo "應用未運行:[$service_name]"
fi
if [ "$process_count" != 0 ] && [ $wait_times -ge $max_wait_times ]; then
read -r -n1 -p "應用未能夠正常停止運行:[$service_name],是否強殺進程[Y|N]?" answer
case $answer in
Y | y | 是)
kill -9 "$pid"
echo -e "\n應用強制停止運行:[$service_name]"
sleep 2
;;
N | n | 否)
continue
;;
esac
fi
read -r -n1 -p "是否啟動應用[Y|N]?" answer
case $answer in
Y | y | 是)
echo -e "\n啟動應用:[$service_name]"
nohup java -jar $java_opts $grep_app_param $append_params >>/dev/null &
echo "正在后臺啟動應用:[$service_name]"
;;
N | n | 否)
continue
;;
esac
done
使用案例
當前目錄為 /root/test
? pwd
/root/test
假如當前目錄存在 3 個 jar 包: server1.jar,server2.jar,server3.jar
和一個上面的重啟腳本: restart-service.sh
? tree .
.
├── restart-service.sh
├── server1.jar
├── server2.jar
└── server3.jar
0 directories, 4 files
為腳本添加執(zhí)行權限
chmod +x restart-service.sh
批量重啟或啟動 3 個服務(注意重啟 java 應用不需要加 .jar
)
./restart-service.sh server1 server2 server3
重啟或啟動單個服務(注意重啟 java 應用不需要加 .jar
)
./restart-service.sh server1