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' , 這時候我們還有個需求就是輸出當前這個日誌的前後幾行:

    cat error.log | grep -B 'nick' 顯示nick及前5行

    cat error.log | grep -A 'nick' 顯示nick及後5行

    cat error.log | grep -C 'nick' 顯示file文件裏匹配nick字串那行以及上下5行

    cat error.log | grep -n -B10 -A10 '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

 

注:>> 爲追加;> 爲重定向,會覆蓋原先的內容

 

 

10:查找關鍵字及其前後的信息

 

  • 根據關鍵字查看日誌
    cat hrun.log | grep "新增用戶"
  • 根據關鍵字查看後10行日誌
    cat hrun.log | grep "新增用戶" -A 10
  • 根據關鍵字查看前10行日誌
    cat hrun.log | grep "新增用戶" -B 10
  • 根據關鍵字查看前後10行日誌,並顯示出行號
    cat -n hrun.log | grep "新增用戶" -C 10
  • 查看日誌前 50 行
    cat hrun.log | head -n 50
  • 查看日誌後 50 行,並顯示出行號
    cat -n hrun.log | tail -n 50

說明:
-A 表示關鍵字之後,After
-B 表示關鍵字之前,Before
-C 表示關鍵字前後,Context

10nohup的作用

 

nohup命令:如果你正在運行一個進程,而且你覺得在退出帳戶時或者關閉客戶端該進程還不會結束,那麼可以使用nohup命令。該命令可以在你退出帳戶/關閉終端之後繼續運行相應的進程。在缺省情況下該作業的所有輸出都被重定向到一個名爲nohup.out的文件中。

nohup command > myout.file 2>&1 &  

在上面的例子中,0 – stdin (standard input),1 – stdout (standard output),2 – stderr (standard error) ;

 

2>&1是將標準錯誤(2)重定向到標準輸出(&1),標準輸出(&1)再被重定向輸入到myout.file文件中。

  

 

1、nohup和&的區別

  & : 指在後臺運行

  nohup : nohup運行命令可以使命令永久的執行下去,和用戶終端沒有關係,例如我們斷開SSH連接都不會影響他的運行,注意了nohup沒有後臺運行的意思;&纔是後臺運行,

  

  &是指在後臺運行,但當用戶退出(掛起)的時候,命令自動也跟着退出

  nohup可以使用Ctrl+C結束掉,而&使用Ctrl+C則結束不掉,nohup不受終端關閉,用戶退出影響,而&則受終端關閉,用戶退出影響

結合起來用就是

nohup COMMAND &

這樣就能使命令永久的在後臺執行

 

 

 11Linux PATH環境變量及作用

 

  在講解 PATH 環境變量之前,首先介紹一下 which 命令,它用於查找某個命令所在的絕對路徑。例如:

複製代碼
[root@localhost ~]# which rm
/bin/rm
[root@localhost ~]# which rmdir
/bin/rmdir
[root@localhost ~]# which ls
alias ls='ls --color=auto'
        /bin/ls
複製代碼

注意,ls 是一個相對特殊的命令,它使用 alias 命令做了別名,也就是說,我們常用的 ls 實際上執行的是 ls --color=auto。

通過使用 which 命令,可以查找各個外部命令(和 Shell 內置命令相對)所在的絕對路徑。學到這裏,讀者是否有這樣一個疑問,爲什麼前面在使用 rm、rmdir、ls 等命令時,無論當前位於哪個目錄,都可以直接使用,而無需指明命令的執行文件所在的位置(絕對路徑)呢?其實,這是 PATH 環境變量在起作用。

首先,執行如下命令:

[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin:/root/bin

這裏的 echo 命令用來輸出 PATH 環境變量的值(這裏的 $ 是 PATH 的前綴符號),PATH 環境變量的內容是由一堆目錄組成的,各目錄之間用冒號“:”隔開。當執行某個命令時,Linux 會依照 PATH 中包含的目錄依次搜尋該命令的可執行文件,一旦找到,即正常執行;反之,則提示無法找到該命令。

如果在 PATH 包含的目錄中,有多個目錄都包含某命令的可執行文件,那麼會執行先搜索到的可執行文件。

從執行結果中可以看到,/bin 目錄已經包含在 PATH 環境變量中,因此在使用類似 rm、rmdir、ls等命令時,即便直接使用其命令名,Linux 也可以找到該命令。

爲了印證以上觀點,下面舉個反例,如果我們將 ls 命令移動到 /root 目錄下,由於 PATH 環境變量中沒有包含此目錄,所有當直接使用 ls 命令名執行時,Linux 將無法找到此命令的可執行文件,並提示 No such file or directory,示例命令如下:

[root@localhost ~]# mv /bin/ls /root
[root@localhost ~]# ls
bash: /bin/ls: No such file or directory

 

此時,如果仍想使用 ls 命令,有 2 種方法,一種是直接將 /root 添加到 PATH 環境變量中,例如:

複製代碼
[root@localhost ~]# PATH=$PATH:/root
[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/sbin:/usr/local/bin:/usr/bin:/bin:/root/bin:/root
[root@localhost ~]# ls
Desktop    Downloads    Music    post-install     Public    Videos
Documents  ls           Pictures post-install.org Templates
複製代碼

注意,這種方式只是臨時有效,一旦退出下次再登陸的時候,$PATH 就恢復成了默認值。


另一種方法是以絕對路徑的方式使用此命令,例如:

[root@localhost ~]# /root/ls
Desktop    Downloads    Music    post-install     Public    Videos
Documents  ls           Pictures post-install.org Templates

爲了不影響系統的正常使用,強烈建議大家將移動後的 ls 文件還原,命令如下:

[root@localhost ~]# mv /root/ls /bin

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章