1. 程式人生 > >實際中 linux的java運維必備的shell

實際中 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>&22>&12>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包改名部署,老包也要改名備份

  1. 第一種方式:根據memeda.war包啟動的埠找到對應的pid,然後kill
  2. 第二種方式:根據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]