開發調試Linux服務時幾個好用的進程和端口查詢命令組合和簡單腳本(ps netstat awk grep)。
這幾天在搭建flume服務並在其框架下開發,反復調試輸入命令讓人不厭其煩,因此在這裡記錄一下自己找到的一些小技巧:
首先,把自己的應用程序做成一個service是一個很好的選擇,一個service就需要支持start 和 stop,start能啟動程序,stop能找到start所啟動的程序的進程並且關掉它。
可以直接根據/etc/init.d/下的服務腳本來改,但我遇到了問題:因為那些系統服務腳本都是基於start-stop-daemon命令,這個命令很強大,可以啟動一個可執行文件並且把進程PID,寫入指定的文件裡,這樣在停止進程時可以直接讀取文件來關掉進程。
但我用這個命令來啟動自己的程序時,程序啟動成功,但是PID文件在無任何錯誤信息的情況下就是沒法生成,測試了root權限執行,也測試了各種寫入路徑(不需要高權限的),統統不行,於是決定慢慢研究這個問題的同時,先用簡單的方法去解決我的需求。
啟動程序很簡單,作為服務,需要後台運行,假設你的可執行文件名叫做PROGRAM。
所以啟動就需要 :
nohup PROGRAM [args] &
要關閉就需要 :
#PROGRAM是進程名
PID = `pidof PROGRAM`
if [ ! -z "$PID" ]; then
kill -15 $PID
fi
但是對於java或者python 程序,進程是java或者python,沒有可區分度,所以不能用"pidof"命令,那麼只能用"ps -ef"命令,用grep對進程信息進行過濾,來找到合適的進程
而一台機器上可以有多個flume服務,每個服務可能就執行參數有一些區別,所以要用多個grep:
PID=`ps -ef | grep java | grep flume | awk '{ print $2 }'`
if [ ! -z "$PID" ]; then
kill -15 $PID
fi
這裡用到了awk命令,取出了"ps"命令打印信息的第二列PID的值。
這樣一個簡單服務的start和stop就完成了。
我還遇到另一個需求,就是檢查某端口的占用情況,並且強制關閉占用這個端口的進程:
# netstat -tlnpa | grep 44444
tcp6 0 0 10.58.242.18:44444 :::* LISTEN 25049/java
端口查詢結果有如上格式,那麼我們可以根據這個格式編寫如下腳本:
pinfo=`netstat -tlnpa | grep 44444`
PID=`awk '{split("'$pinfo'", array, "/");print array[2]}' `
if [ ! -z "$PID" ]; then
kill -15 $PID
fi
就搞定了。
深入挖掘awk 和 grep 還可以有很多用處,作為shell文本處理的利器,我這裡只是日常簡單的應用,希望對大家有幫助。