實際中 linux的java運維必備的shell
下面的各個的linux的shell指令碼,是我在實踐中用到的,積累下來。部分指令碼都做了修改,刪除一些有坑的操作。
if else的判斷,判斷檔案是否存在,判斷數字大小。下面是shell指令碼
#判斷檔案是否存在 且是否是檔案 if [ -f test2.sh ]; then echo "file exist" else echo "file does not exist " fi #判斷檔案是否存在 且是否是檔案 if [ -f test.sh ]; then echo "是檔案" fi #鍵盤輸入內容 echo -n "plese input a number " read num #判斷輸入內容的數字大小 if [ "$num" -lt "10" ]; then echo "little 10" elif [ "$num" -gt "10" ]; then echo "great 10" else echo "nicai" fi
修改檔名字
mv central.war09 central.war
找到正在執行的war包的程序,然後結束該程序。“|”表示一個管道的意思,可以理解為東西從管s道的一邊流向另外一邊。
ps -ef | grep central.war
kill -9 pid
執行jar檔案
java -jar central.jar
一個xxx.sh指令碼檔案,要求是輸出某個資料夾下一個檔案內容到命令列介面。tail -n 表示尾部輸入多少行,這裡表示的是從尾部倒數10行
#!/bin/sh cd /home/chenrui/Documents/my_shell tail -n 10 test.sh
終端輸出內容 輸入到指定檔案下
一個xxx.sh指令碼檔案,sh指令碼中的命令可能會往終端中輸出內容,現在的要求是sh指令碼繼續執行,輸出的內容不需要向終端輸出,輸出到指定的資料夾內。
在shell命令中,通常會出現類似這樣子的命令:1>&2,2>&1,2>,1>,那麼這些數字的意思是下面黑體字。
0 為stdin標準輸入
1 stdout標準輸出
2 stderr標準錯誤 //輸出一些錯誤的資訊
&>error.log 表示是把標準輸出和錯誤輸出都輸入到檔案error.log中;
1>&2 意思是把標準輸出重定向到標準錯誤;
2>&1 意思是把標準錯誤輸出重定向到標準輸出。
如ls某個不存在的檔案
[email protected]:~/Documents/my_shell$ ls hahah
ls: cannot access 'hahah': No such file or directory
那麼使用
[email protected]:~/Documents/my_shell$ ls haha 2>error.log
此刻檢視error.log內容," 2>error.log " 是表示把錯誤的內容輸出到error.log裡了。
[email protected]:~/Documents/my_shell$ more error.log
ls: cannot access 'haha': No such file or directory
同理,如果要是正確的內容輸入到error.log裡去 2>error.log是輸入不進去,直接在終端顯示了。不信你可以試試,哈哈,試一下吧(篇幅有限我不能再填上去了)
在sh中執行jar包,然後把jar中的控制檯輸出輸出到指定檔案內
jarPath=/home/chenrui/java/
cd $jarPath
java -jar xxxx.jar >> error.log 2>&1
執行這個sh檔案後,可以看到終端不允許你繼續操作下條指令。需要在java -jar xxxx.jar >> error.log 2>&1的後面再加一個&符號就行了。java -jar xxxx.jar >> error.log 2>&1 &
我這裡有一個memeda.war包,從jenkins構建以後生成的名字為memeda.war_newbuild。此時需要將新的newbuild包改名部署,老包也要改名備份
- 第一種方式:根據memeda.war包啟動的埠找到對應的pid,然後kill
- 第二種方式:根據ps memeda.war命令找到對應的pid,然後kill
第一種方式
##############根據埠號結束程序##################
port=25010
#根據埠號查詢對應的pid
pid=$(netstat -nlp | grep :$port | awk '{print $7}' | awk -F"/" '{ print $1 }');
#殺掉對應的程序,如果pid不存在,則不執行
if [ -n "$pid" ]; then
kill -9 $pid;
echo "結束埠 $port 程序:"$pid;
ps -ef | grep memeda.war
if [ -e memeda.war_newbuild ]; then
echo "開始啟動"
mv memeda.war "memeda.war_"`date "+%Y%m%d_%H%M%S"`
mv memeda.war_newbuild memeda.war
./start.sh
ps -ef | grep memeda.war
echo "啟動完成"
fi
fi
第二種方式
##############根據ps命令結束程序##################
#根據war包查詢對應的pid
pid=$(ps -ef | grep memeda.war | grep java | awk '{print $2}');
#殺掉對應的程序,如果pid不存在,則不執行
if [ -n "$pid" ]; then
kill -9 $pid;
echo "結束程序:"$pid;
ps -ef | grep memeda.war
if [ -e memeda.war_newbuild ]; then
echo "開始啟動"
mv memeda.war "memeda.war_"`date "+%Y%m%d_%H%M%S"`
mv memeda.war_newbuild memeda.war
./start.sh
ps -ef | grep memeda.war
echo "啟動完成"
fi
fi
注:start.sh指令碼的內容與解釋,在本文的 “終端輸出內容 輸入到指定檔案下” 有解釋。
這條命令:mv memeda.war "memeda.war_"`date "+%Y%m%d_%H%M%S"` ,在date中有個長得像單引號的,那個不是單引號
那個是tab鍵上面,1鍵左邊的那個標號。切記不是單引號!
直接根據ps命令結束一個程序
ps -ef | grep memeda.war | grep -v grep | awk '{print $2}' | xargs kill -9
伺服器定時任務
在伺服器執行的爬蟲,需要每個一段時間執行一次執行指令碼
比如每分鐘執行一次指令碼
[email protected]:~$ crontab -e
# m h dom mon dow command
*/1 * * * * sh /home/chenrui/test.sh
儲存內容ctrl + o進入指令輸入中,enter回車。
然後ctrl + x鍵退出。
如果存在錯誤 email me: [email protected]