背景:
日常工作中有時會需要手動重啟tomcat項目,每次都是cd 到項目路徑下--->cd bin--->./startup.sh, 一直都是重復性的 cd cd cd 很煩人。有次同事說,怎么不把它搞成自動化腳本呢?每次這樣搞,多浪費時間。 so 決定寫個腳本解放雙手。
之前考慮過有python來實現,后來放棄了。目前服務器中的python版本是2.6.6,目前大多數用的版本是python 3.x 。
需求:
想用腳本重啟tomcat項目,通過傳參的方式(參數:項目的名稱) 。
腳本名稱:restartApp.sh
腳本運行方式:sh restartApp.sh tomcat-8107
代碼:
#!/bin/bash set -x #ps_result=`ps -ef | grep tomcat| grep $1` #echo "${ps_result}" echo -e "\n\n\n" pids=`ps -ef| grep tomcat |grep $1 |grep -v 'grep'|grep -v 'restartApp.sh'|awk '{print $2}'` count=0 pid_num=0 for pid in ${pids} do pid_num=${pid} echo "pid_num:${pid_num}" #count=`expr ${count}+1` count=$(($count+1)) echo "count: ${count}" done if [[ $count -gt 1 ]] then echo "一個項目有兩個進程 異常" else kill -9 ${pids} echo "Kill ${pids} Success!" #重啟 echo "重啟中。。。。。。。" sh /home/lifesea/$1/bin/startup.sh fi echo -e "\n\n\n"
知識點:
-
#!/bin/bash是指此腳本使用/bin/bash來解釋執行,#!是特殊的表示符,其后面根的是解釋此腳本的shell的路徑。
- grep -v 是反向查找的意思,比如 grep -v restartApp 就是查找不含有 restartApp 字段的行
- shell 傳遞變量 如下:
截圖文字來源:https://www.cnblogs.com/bclshuai/p/7409773.html
-
awk '{print $2}' 打印第二個字段
遇到的問題:
1.反撇號的用處,第一次用到
2.
開始的時候: 沒有加 grep -v 'restartApp.sh' 導致查詢出來的進程有很3個(除了grep),如下圖
更改后:ps -ef| grep tomcat |grep $1 |grep -v 'grep'|grep -v 'restartApp.sh'|awk '{print $2}'
執行以下語句得出如下圖的結果
$1更改為:grep tomcat-8107
#ps_result=`ps -ef | grep tomcat| grep $1`
#echo "${ps_result}"
3.在服務器上調試腳本 vim restartApp.sh 腳本 因為不熟悉的緣故,導致效率低。
vim 常用快捷鍵:
:set number 顯示行號
:set -x 詳細的日志輸出
h 向前
j 向下
k 向上
l 向右
4.感謝znn 從昨天下午一直到今天,一直協助我定位問題。