1. 程式人生 > 其它 >Linux下檢視日誌用到的常用命令

Linux下檢視日誌用到的常用命令

殺殭屍程序部分程式設計師,肯定喜歡下面命令:

  ps -ef | grep java (先查java程序ID)

  kill -9 PID(生產環境謹慎使用)

kill、killall、pkill命令的區別

  kill:通過pid來殺死程序

  killall (killall [引數] [程序名]):Linux系統中的killall命令用於殺死指定名字的程序(kill processes by name)。我們可以使用kill命令殺死指定程序PID的程序,如果要找到我們需要殺死的程序,我們還需要在之前使用ps等命令再配合grep來查詢程序,而killall把這兩個過程合二為一,是一個很好用的命令。

  pkill:pkill 和killall 應用方法差不多,也是直接殺死執行中的程式;如果你想殺掉單個程序,請用kill 來殺掉。例子:pkill -9 firefox

1.檢視日誌常用命令 tail: -n 是顯示行號;相當於nl命令;例子如下: tail -100f test.log 實時監控100行日誌

tail -n 10 test.log 查詢日誌尾部最後10行的日誌;

tail -n +10 test.log 查詢10行之後的所有日誌;

head:

跟tail是相反的,tail是看後多少行日誌;例子如下:

head -n 10 test.log 查詢日誌檔案中的頭10行日誌;

head -n -10 test.log 查詢日誌檔案除了最後10行的其他所有日誌;

cat:

tac是倒序檢視,是cat單詞反寫;例子如下:

cat -n test.log |grep "debug" 查詢關鍵字的日誌

2. 應用場景一:按行號檢視---過濾出關鍵字附近的日誌

1)cat -n test.log |grep "debug" 得到關鍵日誌的行號

 2)通常查找出錯誤日誌 cat error.log | grep 'nick' , 這時候我們還有個需求就是輸出當前這個日誌的前後幾行:

    caterror.log|grep-B5'nick'顯示nick及前5行

    caterror.log|grep-A5'nick'顯示nick及後5行

    caterror.log|grep-C5'nick'顯示file檔案裡匹配nick字串那行以及上下5行

    caterror.log|grep-n -B10 -A105'nick'顯示file檔案裡匹配nick字串前後10行

  

3. 應用場景二:選取日誌中特定範圍進行分析

  1)cat -n test.log |tail -n +1000|head -n 20 從第1000行開始,顯示20行

tail -n +1000表示查詢1000行之後的日誌

head -n 20 則表示在前面的查詢結果裡再查前20條記錄

  2)cat catalina.out | head -n 1400| tail -n +1350 顯示1350行到1400行 (實現原理都差不多,就是通過語法糖)

 (1)按日期擷取 :一般在日誌系統中都會記錄列印日誌的時間,通常我們非常需要查詢指定時間端的日誌:

  sed -n '/2014-12-17 16:17:20/,/2014-12-17 16:17:36/p' test.log

  特別說明:該命令中的兩個日期值必須是日誌檔案中包含的值,否則該命令無效.;先 grep '2014-12-17 16:17:20' test.log 來確定日誌中是否有該 時間點

 (2)按行數擷取

    sed -n ‘10000,20000p’test.log

    sed -i '/關鍵詞/d' catalina.out 刪除包含關鍵詞的行

4.應用場景三:日誌內容特別多,列印在螢幕上不方便檢視

(1)使用moreless命令,

如: cat -n test.log |grep "debug" |more 這樣就分頁列印了,通過點選空格鍵翻頁

(2)使用 >xxx.txt 將其儲存到檔案中,到時可以拉下這個檔案分析

如:cat -n test.log |grep "debug" >debug.txt

5:使用管道進行and or條件處理

  and使用管道實現 例如:grep-n'日誌排查' test.log| grep'日誌'

  or 用-E 例如:grep-n-E'日誌排查|hello' test.log滿足兩個關鍵字的都可以找出來

6:如何看查佔用cpu最多的程序?

方法一

核心指令:ps

實際命令

  ps H -eo pid,pcpu | sort -nk2 | tail

執行效果如下:

[work@test01 ~]$ ps H -eo pid,pcpu | sort -nk2 | tail

31396 0.6

31396 0.6

31396 0.6

31396 0.6

31396 0.6

31396 0.6

31396 0.6

31396 0.6

30904 1.0

30914 1.0

結果

瞧見了吧,最耗cpu的pid=30914。

畫外音:實際上是31396。

方法二

核心指令:top

實際命令

  top

  Shift + t

  top 命令類似於 Windows 的工作管理員,能夠顯示 Linux 系統中執行的程序的動態實時檢視。

  預設情況下,top 輸出結果是按 CPU 佔用進行排序,每 5s 更新一次結果。我們可以使用top-b|head-50顯示排前 50 的佔用 CPU 最高的程序(Linux 中如何找出 CPU 佔用高的程序

)。

上面的命令解釋如下:

  • -b:批次檔模式

  • head -50:顯示輸出結果的前 50 個

  • PID:程序的 ID

  • USER:程序的歸屬者

  • PR:程序的等級

  • NI:程序的 NICE 值

  • VIRT:程序使用的虛擬記憶體

  • RES:程序使用的實體記憶體

  • SHR:程序使用的共享記憶體

  • S:這個值表示程序的狀態: S = 睡眠,R = 執行,Z = 殭屍程序

  • %CPU:程序佔用的 CPU 比例

  • %MEM:程序使用的 RAM 比例

  • TIME+:程序運行了多長時間

  • COMMAND:程序名字

如果想看程序的完整資訊,可以加 -c 引數,如top-b-c|head-50

使用 ps

  ps 就是程序狀態的縮寫,可以顯示當前執行程序的詳細資訊,如使用者名稱、使用者 ID、CPU 使用率、記憶體使用、程序啟動日期時間、命令名等等。

  使用ps-eo pid,ppid,%mem,%cpu,cmd--sort=-%cpu|head可以顯示佔用 CPU 較高的程序資訊(注意--sort=-%cpu)。如下:

# ps -eo pid,ppid,%mem,%cpu,cmd --sort=-%cpu | head

PID PPID %MEM %CPU CMD

18527 1714 4.2 40.3 /usr/lib/firefox/firefox -contentproc -childID 18 -isForBrowser -prefsLen 10002 -prefMapSize 213431 -parentBuildID 20191031132559 -greomni /usr/lib/firefox/omni.ja -appomni /usr/lib/firefox/browser/omni.ja -appdir /usr/lib/firefox/browser 1714 true tab

1714 1152 5.6 8.0 /usr/lib/firefox/firefox --new-window

18324 1714 4.9 6.3 /usr/lib/firefox/firefox -contentproc -childID 16 -isForBrowser -prefsLen 10002 -prefMapSize 213431 -parentBuildID 20191031132559 -greomni /usr/lib/firefox/omni.ja -appomni /usr/lib/firefox/browser/omni.ja -appdir /usr/lib/firefox/browser 1714 true tab

3286 1714 2.0 5.1 /usr/lib/firefox/firefox -contentproc -childID 14 -isForBrowser -prefsLen 8078 -prefMapSize 213431 -parentBuildID 20191031132559 -greomni /usr/lib/firefox/omni.ja -appomni /usr/lib/firefox/browser/omni.ja -appdir /usr/lib/firefox/browser 1714 true tab

1783 1714 3.0 4.5 /usr/lib/firefox/firefox -contentproc -childID 1 -isForBrowser -prefsLen 1 -prefMapSize 213431 -parentBuildID 20191031132559 -greomni /usr/lib/firefox/omni.ja -appomni /usr/lib/firefox/browser/omni.ja -appdir /usr/lib/firefox/browser 1714 true tab

1227 1152 2.3 2.5 /usr/bin/gnome-shell

1170 1168 3.5 2.2 /usr/lib/Xorg vt2 -displayfd 3 -auth /run/user/1000/gdm/Xauthority -nolisten tcp -background none -noreset -keeptty -verbose 3

16865 1714 2.5 2.1 /usr/lib/firefox/firefox -contentproc -childID 15 -isForBrowser -prefsLen 10002 -prefMapSize 213431 -parentBuildID 20191031132559 -greomni /usr/lib/firefox/omni.ja -appomni /usr/lib/firefox/browser/omni.ja -appdir /usr/lib/firefox/browser 1714 true tab

2179 1714 2.7 1.8 /usr/lib/firefox/firefox -contentproc -childID 6 -isForBrowser -prefsLen 7821 -prefMapSize 213431 -parentBuildID 20191031132559 -greomni /usr/lib/firefox/omni.ja -appomni /usr/lib/firefox/browser/omni.ja -appdir /usr/lib/firefox/browser 1714 true tab

上命令的解釋如下:

  • -e:選擇所有程序

  • -o:自定義輸出格式

  • –sort=-%cpu:基於 CPU 使用率對輸出結果排序

  • head:顯示結果的前 10 行

  • PID:程序的 ID

  • PPID:父程序的 ID

  • %MEM:程序使用的 RAM 比例

  • %CPU:程序佔用的 CPU 比例

  • Command:程序名字

如果想看命令名字而不是命令的絕對路徑,可以:

7:找到了最耗CPU的程序ID,對應的服務名是什麼呢?

方法一

核心指令:ps

實際命令

  ps aux | fgrep pid

執行效果如下:

[work@test01 ~]$ ps aux | fgrep 30914

work 30914 1.0 0.8 309568 71668 ? Sl Feb02 124:44 ./router2 –conf=rs.conf

結果

瞧見了吧,程序是./router2

畫外音: grep 和fgrep的區別?

兩者都是搜尋工具,但功能上有區別。
  1,首先,grep支援的是標準正則表示式。
  2,fgrep,不支援正則表示式,只用於匹配固定字串。

所以後者要比前者速度快,當然同時後者的搜尋功能要弱於前者。

方法二

直接查proc即可。

實際命令

ll /proc/pid

執行效果如下:

[work@test01 ~]$ ll /proc/30914

lrwxrwxrwx 1 work work 0 Feb 10 13:27 cwd -> /home/work/im-env/router2

lrwxrwxrwx 1 work work 0 Feb 10 13:27 exe -> /home/work/im-env/router2/router2

畫外音:這個好,全路徑都出來了。

8:如何檢視某個埠的連線情況?

方法一

核心指令:netstat

實際命令

  netstat -lap | fgrep port

執行效果如下:

[work@test01 ~]$ netstat -lap | fgrep 22022

tcp 0 0 10.58.xxx.29:22022 *:* LISTEN 31396/imui

tcp 0 0 10.58.xxx.29:22022 10.58.xxx.29:46642 ESTABLISHED 31396/imui

tcp 0 0 10.58.xxx.29:22022 10.58.xxx.29:46640 ESTABLISHED 31396/imui

方法二

核心指令:lsof

實際命令

  lsof -i :port

執行效果如下:

[work@test01 ~]$ /usr/sbin/lsof -i :22022

COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME

router 30904 work 50u IPv4 69065770 TCP 10.58.xxx.29:46638->10.58.xxx.29:22022 (ESTABLISHED)

router 30904 work 51u IPv4 69065772 TCP 10.58.xxx.29:46639->10.58.xxx.29:22022 (ESTABLISHED)

router 30904 work 52u IPv4 69065774 TCP 10.58.xxx.29:46640->10.58.xxx.29:22022 (ESTABLISHED)

9:歸檔壓縮檔案匯出指定內容到檔案

命令: zcat 壓縮檔案 |grep '關鍵詞' > 111.txt

學而不思則罔,思而不學則殆