1. 程式人生 > 實用技巧 >伺服器維護常用命令

伺服器維護常用命令

>>> hot3.png

一、常用命令

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"

在預釋出機器上檢查各個伺服器的http連結數

二、proc下的偽檔案。如:meminfo檢查記憶體資訊,cpuinfo核心資訊。

cat/proc/cpuinfo檢查cpu的資訊。我們的一些程式根據cpu核心的數量做過優化(如:memcached假的多核可能會引起一些bug。)

如上圖baike-web14核的,baike-web2是雙核超執行緒的。

擁有相同physicalid的所有邏輯處理器共享同一個物理插座。每個physicalid代表一個唯一的物理封裝。Siblings表示位於這一物理封裝上的邏輯處理器的數量,如果不存在表示1。每個coreid均代表一個唯一的處理器核心。所有帶有相

coreid的邏輯處理器均位於同一個處理器核心上。如果有一個以上邏輯處理器擁有相同的coreidphysicalid,則說明系統支援超執行緒(HT)技術。如果有兩個或兩個以上的邏輯處理器擁有相同的physicalid,但是coreid不同,則說明這是一個多核心處理器。

網路連線

netstat-t:顯示TCP連結資訊;-u:顯示UDP連結資訊;-n直接顯示ip,不做名稱轉換;-p:顯示相應的程序PID以及名稱(要root許可權)

如果要檢視關於sockets更詳細佔用資訊等,可以使用lsof.

a)netstat-anp|grepjava|grep3306|wc–l

檢查Java程序中資料庫的連結數量

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.使用jmapdumpjava記憶體中全部物件,分析死鎖的位置。

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可以檢視分析報告。

或者可以使用eclipsemat外掛分析,它可以以圖形形式分析出記憶體中的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統計googlebaike爬蟲的訪問量。

一、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

[plain] view plain copy
  1. cmd>file把stdout重定向到file檔案中;
  2. cmd>>file把stdout重定向到file檔案中(追加);
  3. cmd1>file把stdout重定向到file檔案中;
  4. cmd>file2>&1把stdout和stderr一起重定向到file檔案中;
  5. cmd2>file把stderr重定向到file檔案中;
  6. cmd2>>file把stderr重定向到file檔案中(追加);
  7. cmd>>file2>&1把stdout和stderr一起重定向到file檔案中(追加);
  8. cmd<file>file2cmd命令以file檔案作為stdin,以file2檔案作為stdout;
  9. cat<>file以讀寫的方式開啟file;
  10. cmd<filecmd命令以file檔案作為stdin;
  11. 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
  1. exec1>outfilename#開啟檔案outfilename作為stdout。
  2. exec2>errfilename#開啟檔案errfilename作為stderr。
  3. exec0<&-#關閉FD0。
  4. exec1>&-#關閉FD1。
  5. 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
  1. /^abc<Enter>#查詢以abc開始的行,不包括以空格開頭的行
  2. /abc$<Enter>#查詢以abc結束的行
  3. //^test<Enter>#查詢^test字串

替換:
:[%]s/old/new/[g]
[plain] view plain copy
  1. :s/old_value/new_value/#替換當前行第一個old_value為new_value
  2. :s/old_value/new_value/g#替換當前行所有old_value為new_value
  3. :n,$s/old_value/new_value/#替換第n行開始到最後一行中每一行的第一個old_value為new_value
  4. :n,$s/old_value/new_value/g#替換第n行開始到最後一行中每一行所有old_value為new_value(n為數字,若n為.,表示從當前行開始到最後一行)
  5. :%s/old_value/new_value/#(等同於:g/old_value/s//new_value/)替換每一行的第一個old_value為new_value
  6. :%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