伺服器維護常用命令
一、常用命令
pstree檢視程序樹。可以很清楚的看到程序之間的關係;
Top:檢視各程序的佔用資源的情況;
du-h--max-depth=1顯示當前目錄中所有子目錄的大小;
w檢視伺服器的load情況
bigip在預釋出機器上使用命令“bigipsh${ip/機器名}{username}”可以檢查機器是在F5上狀態是disable還是enable.
gm.sh"curlhttp://localhost/monitor/ok.html"在預釋出機器上檢查各個伺服器的健康檢查頁面。
gm.sh"psamx|grephttpd|wc-l"
二、proc下的偽檔案。如:meminfo檢查記憶體資訊,cpuinfo核心資訊。
cat/proc/cpuinfo檢查cpu的資訊。我們的一些程式根據cpu核心的數量做過優化(如:memcached,假的多核可能會引起一些bug。)
如上圖baike-web1是4核的,baike-web2是雙核超執行緒的。
擁有相同physicalid的所有邏輯處理器共享同一個物理插座。每個physicalid代表一個唯一的物理封裝。Siblings表示位於這一物理封裝上的邏輯處理器的數量,如果不存在表示1。每個coreid均代表一個唯一的處理器核心。所有帶有相
三、網路連線
netstat:-t:顯示TCP連結資訊;-u:顯示UDP連結資訊;-n直接顯示ip,不做名稱轉換;-p:顯示相應的程序PID以及名稱(要root許可權)
如果要檢視關於sockets更詳細佔用資訊等,可以使用lsof.
a)netstat-anp|grepjava|grep3306|wc–l
b)netstat-na|grepESTABLISHED|awk'{print$4}'|grep":80$"|wc–l檢查已經建立的80埠的連線數
c)netstat-na|grep“:2088”檢查搜尋引擎的連線數
四、dumpjava程序堆疊
a)kill-3${java程序Id},可以在java程序的日誌中看到輸出(jboss記錄在jboss_stdout.log中)
b)jstack$pid.直接dump當前程序的的堆疊資訊。
對於threaddump資訊,主要關注的是執行緒的狀態和其執行堆疊,特別是load很高的時候,通過threaddump可以看到執行緒到底在幹嘛,從中找出問題。執行緒的狀態一般為三類:runable:當前可以執行的執行緒,Waitingonmonitor:執行緒主動wait,Waitingformonitorentry:執行緒等鎖.Cpu很忙則關注runnable的執行緒,Cpu閒則關注waitingformonitorentry的執行緒。
五、java記憶體溢位
1、可以先用jstat-gcutil${pid}{interval}看看java記憶體回收的動態資訊。interval–表示間隔列印的時間,單位為毫秒
圖中引數含義如下:
S0—Heap上的Survivorspace0區已使用空間的百分比
S1—Heap上的Survivorspace1區已使用空間的百分比
E—Heap上的Edenspace區已使用空間的百分比
O—Heap上的Oldspace區已使用空間的百分比
P—Permspace區已使用空間的百分比
YGC—從應用程式啟動到取樣時發生YoungGC的次數
YGCT–從應用程式啟動到取樣時YoungGC所用的時間(單位秒)
FGC—從應用程式啟動到取樣時發生FullGC的次數
FGCT–從應用程式啟動到取樣時FullGC所用的時間(單位秒)
2.使用jmap來dumpjava記憶體中全部物件,分析死鎖的位置。
jmap-histo$pid快速檢視當前記憶體中各個Java物件的大小和數量
jmap-dump:live,format=b,file=heap.dmp$pid可以將jvm堆疊中的資訊全部複製到檔案head.dmp中,注意這個heap.dmp檔案會比較大,線上jboss分配的記憶體一般為2g,當記憶體溢位時dump出來的head.dmp檔案也是2g,所以dump的時間也比較長,一般會有半個小時.
日誌檔案生成後執行命令“jhat-J-mx768m-port7001heap.dmp”分析堆疊日誌(注意不要在線上伺服器上分析)。訪問http://localhost:7001可以檢視分析報告。
或者可以使用eclipse的mat外掛分析,它可以以圖形形式分析出記憶體中的java物件的分佈:(外掛地址http://download.eclipse.org/mat/1.0/update-site/).匯入後可以生成一個圖形報表
六、7001埠報警。
一般情況是jboss掛掉了。因為java程序已經退出。1首先需要檢視:jboss_stdout.log,它會告訴你jbosscrash的一些資訊,它還會告訴你在jbosscrash有一個詳細的出錯報告,位置在/web-deploy/bin/hs_err_pid.log
七、cookie日誌分析
catcookie_log|awk'{print$1}'|grep-v"172.16"|grep-v"127.0.0.1"|sort|uniq-c|sort-n|tail-n10提取訪問量前10位的ip.
catcookie_log|grep'09/Dec/2010:18:01'|wc–l檢查18:01這一分鐘的訪問總量。
catcookie_log|grep'HTTP/.../"[4|5]'|more檢視響應出錯的請求。
catcookie_log|grep-E'Googlebot|Baiduspider'|wc–l統計google和baike爬蟲的訪問量。
一、linux重定向
1基本概念
(這是理解後面的知識的前提,請務必理解)
a、 I/O重定向通常與 FD(File Descriptor:檔案描述符)有關,shell的FD通常為10個,即 0~9;
b、 常用FD有3個,為0(stdin,標準輸入)、1(stdout,標準輸出)、2(stderr,標準錯誤輸出),預設與keyboard、monitor有關;
c、 用 < 來改變讀進的資料通道(stdin),使之從指定的檔案讀進;
d、 用 > 來改變送出的資料通道(stdout, stderr),使之輸出到指定的檔案;
e、 0 是 < 的預設值,因此 < 與 0<是一樣的;同理,> 與 1> 是一樣的;
f、 在IO重定向 中,stdout 與 stderr 的管道會先準備好,才會從 stdin 讀進資料;
g、 管道“|”(pipe line):上一個命令的 stdout 接到下一個命令的 stdin;
h、 tee 命令是在不影響原本 I/O 的情況下,將 stdout 複製一份到檔案去;
i、 bash(ksh)執行命令的過程:分析命令-變數求值-命令替代(``和$( ))-重定向-萬用字元展開-確定路徑-執行命令;
j、 ( ) 將 command group 置於 sub-shell 去執行,也稱 nested sub-shell,它有一點非常重要的特性是:繼承父shell的Standard input, output, and
error plus any other open file descriptors。
k、 exec 命令:常用來替代當前 shell 並重新啟動一個 shell,換句話說,並沒有啟動子 shell。使用這一命令時任何現有環境都將會被清除。exec 在對檔案描述符進行操作的時候
,也只有在這時,exec 不會覆蓋你當前的 shell 環境。
2基本IO
- cmd>file把stdout重定向到file檔案中;
- cmd>>file把stdout重定向到file檔案中(追加);
- cmd1>file把stdout重定向到file檔案中;
- cmd>file2>&1把stdout和stderr一起重定向到file檔案中;
- cmd2>file把stderr重定向到file檔案中;
- cmd2>>file把stderr重定向到file檔案中(追加);
- cmd>>file2>&1把stdout和stderr一起重定向到file檔案中(追加);
- cmd<file>file2cmd命令以file檔案作為stdin,以file2檔案作為stdout;
- cat<>file以讀寫的方式開啟file;
- cmd<filecmd命令以file檔案作為stdin;
- cmd<<delimiterHeredocument,從stdin中讀入,直至遇到delimiter分界符。
3進階IO
>&n 使用系統呼叫 dup (2) 複製檔案描述符 n 並把結果用作標準輸出;
<&n 標準輸入複製自檔案描述符 n;
<&- 關閉標準輸入(鍵盤);
>&- 關閉標準輸出;
n<&- 表示將 n 號輸入關閉;
n>&- 表示將 n 號輸出關閉;
上述所有形式都可以前導一個數字,此時建立的檔案描述符由這個數字指定而不是預設的 0 或 1。如:
... 2>file 執行一個命令並把錯誤輸出(檔案描述符 2)定向到 file。
... 2>&1 執行一個命令並把它的標準輸出和輸出合併。(嚴格的說是通過複製檔案描述符 1 來建立檔案描述符 2 ,但效果通常是合併了兩個流。)
我們對 2>&1詳細說明一下 :2>&1 也就是 FD2=FD1 ,這裡並不是說FD2 的值 等於FD1的值,因為 > 是改變送出的資料通道,也就是說把 FD2 的 “資料輸出通道” 改為 FD1
的 “資料輸出通道”。如果僅僅這樣,這個改變好像沒有什麼作用,因為 FD2 的預設輸出和 FD1的預設輸出本來都是 monitor,一樣的! 但是,當 FD1 是其他檔案,甚至是其他 FD
時,這個就具有特殊的用途了。請大家務必理解這一點。
[plain] view plain copy
- exec1>outfilename#開啟檔案outfilename作為stdout。
- exec2>errfilename#開啟檔案errfilename作為stderr。
- exec0<&-#關閉FD0。
- exec1>&-#關閉FD1。
- exec5>&-#關閉FD5。
from: http://baike.baidu.com/view/2173319.htm
二、VI幾個常用的技巧
0 游標定位到當前行行首,非輸入模式
$ (shift+4)游標定位到當前行行尾,非輸入模式
1G 檔案頭(注:這裡的1表示要去到的行號,如果轉到第2行,則是2G,這裡一定是大寫的G)
G(shift+g,大寫鎖定鍵+g) 文尾
A(Shift+a)當前行行尾,並進入編輯狀態
ctrl+f 向上翻頁
ctrl+b 向下翻頁
ctrl+u 向上翻半頁
ctrl+d 向下翻半頁
查詢:
/pattern<Enter> :向下查詢pattern匹配字串
?pattern<Enter>:向上查詢pattern匹配字串
使用了查詢命令之後,使用如下兩個鍵快速查詢:
n:按照同一方向繼續查詢
N:按照反方向查詢
Example:
如我們要搜尋"password",只需要輸入"/password"回車即可
除此之外,pattern還可以使用一些特殊字元,包括(/、^、$、*、.),其中前三個這兩個是vi與vim通用的,“/”為轉義字元。
Example:
[plain] view plain copy
- /^abc<Enter>#查詢以abc開始的行,不包括以空格開頭的行
- /abc$<Enter>#查詢以abc結束的行
- //^test<Enter>#查詢^test字串
替換:
:[%]s/old/new/[g]
[plain] view plain copy
- :s/old_value/new_value/#替換當前行第一個old_value為new_value
- :s/old_value/new_value/g#替換當前行所有old_value為new_value
- :n,$s/old_value/new_value/#替換第n行開始到最後一行中每一行的第一個old_value為new_value
- :n,$s/old_value/new_value/g#替換第n行開始到最後一行中每一行所有old_value為new_value(n為數字,若n為.,表示從當前行開始到最後一行)
- :%s/old_value/new_value/#(等同於:g/old_value/s//new_value/)替換每一行的第一個old_value為new_value
- :%s/old_value/new_value/g#(等同於:g/old_value/s//new_value/g)替換每一行中所有old_value為new_value
以上的操作都不是在編輯狀態下使用的,機使用前需要先猛擊ESC.
三、Linux xargs命令
xargs是給命令傳遞引數的一個過濾器,也是組合多個命令的一個工具。它把一個數據流分割為一些足夠小的塊,以方便過濾器和命令進行處理。通常情況下,xargs從管道或者stdin中讀取資料,但是它也能夠從檔案的輸出中讀取資料。xargs的預設命令是echo,這意味著通過管道傳遞給xargs的輸入將會包含換行和空白,不過通過xargs的處理,換行和空白將被空格取代。
xargs 是一個強有力的命令,它能夠捕獲一個命令的輸出,然後傳遞給另外一個命令,下面是一些如何有效使用xargs 的實用例子。
1. 當你嘗試用rm 刪除太多的檔案,你可能得到一個錯誤資訊:/bin/rm Argument list too long. 用xargs 去避免這個問題
# find ~ -name ‘*.log’ -print0 | xargs -0 rm -f
2. 獲得/etc/ 下所有*.conf 結尾的檔案列表,有幾種不同的方法能得到相同的結果,下面的例子僅僅是示範怎麼實用xargs ,在這個例子中實用 xargs將find 命令的輸出傳遞給ls -l
# find /etc -name "*.conf" | xargs ls –l
3. 假如你有一個檔案包含了很多你希望下載的URL, 你能夠使用xargs 下載所有連結
# cat url-list.txt | xargs wget –c
4. 查詢所有的jpg 檔案,並且壓縮它
# find / -name *.jpg -type f -print | xargs tar -cvzf images.tar.gz
5. 拷貝所有的圖片檔案到一個外部的硬碟驅動
# ls *.jpg | xargs -n1 -i cp {} /external-hard-drive/directory
其他的示列:
find /tmp -name core -type f -print | xargs /bin/rm -f
查詢目錄/tmp下面為core的檔案並刪除,不過這裡需要注意的是如果檔名中有空格或者換行符,該命令就不會正確的執行.
find /tmp -name core -type f -print0 | xargs -0 /bin/rm -f
查詢目錄/tmp下面為core的檔案並刪除,這時候就可以正確的處理檔名中有空格或者換行符的檔案了.
find /tmp -depth -name core -type f -delete
查詢目錄/tmp下面為core的檔案並刪除,此時不需要使用fork和exec來啟動,因為我們不需要使用額外的xargs處理.
cut -d: -f1 < /etc/passwd | sort | xargs echo
顯示/etc/passwd中的使用者名稱
轉載於:https://my.oschina.net/liting/blog/473212