Linux核心進程管理命令

1.1 ps:查看進程

1.1.1 命令解釋

功能說明

ps命令用於列出執行ps命令的那個時刻的進程快照,就像用手機給進程照了一張照片。如果想要動態地顯示進程,就需要使用top命令,該命令類似於把手機切換成錄像模式。

選項說明

參數選項解釋說明(帶@的爲重點
-a顯示所有終端下執行的進程
a顯示與終端相關的所有進程,包含每個進程的完整路徑@
x顯示與終端無關的所有進程@
u顯示進程的用戶信息@
-u顯示指定用戶相關的進程信息
-e顯示所有進程@
-f額外顯示UID,PPID,C與STIME欄位@
f顯示進程樹
-H顯示進程樹
-l以詳細的格式來顯示進程的狀況
-o自定義輸出指定的字段,以逗號分隔
-sort keykey表示爲指定字段排序,默認升序,+key升序,-key降序

1.1.2 使用範例

(1)ps 命令不接任何參數

[root@Mr_chen ~]# ps
   PID TTY          TIME CMD
  1135 pts/0    00:00:00 bash
  1152 pts/0    00:00:00 bash
  1162 pts/0    00:00:00 bash
  1173 pts/0    00:00:00 bash
  1182 pts/0    00:00:00 ps

默認情況下,ps命令不接任何參數時,輸出的是使用者當前所在終端(窗口)的進程,其輸出結果中的各項說明如下。

  • [x] :PID是進程的標識號
  • [x] :TTY是進程所屬的終端控制檯
  • [x] :TIME列是進程所使用的總的CPU時間
  • [x] :CMD列是正在執行的命令行

(2)ps -ef

[root@Mr_chen ~]# ps -ef    # -e顯示所有進程,-f格外顯示UIDPPIDCSTIME欄位
UID         PID   PPID  C STIME TTY          TIME CMD
root          1      0  0 15:00 ?        00:00:00 /sbin/init
root          2      0  0 15:00 ?        00:00:00 [kthreadd]
root          3      2  0 15:00 ?        00:00:00 [migration/0]
root          4      2  0 15:00 ?        00:00:00 [ksoftirqd/0]
root          5      2  0 15:00 ?        00:00:00 [migration/0]
root          6      2  0 15:00 ?        00:00:00 [watchdog/0]
root          7      2  0 15:00 ?        00:00:00 [events/0]
root          8      2  0 15:00 ?        00:00:00 [cgroup]
root          9      2  0 15:00 ?        00:00:00 [khelper]
root         10      2  0 15:00 ?        00:00:00 [netns]
root         11      2  0 15:00 ?        00:00:00 [async/mgr]
root         12      2  0 15:00 ?        00:00:00 [pm]
root         13      2  0 15:00 ?        00:00:00 [sync_supers]
root         14      2  0 15:00 ?        00:00:00 [bdi-default]
root         15      2  0 15:00 ?        00:00:00 [kintegrityd/0]
root         16      2  0 15:00 ?        00:00:00 [kblockd/0]
root         17      2  0 15:00 ?        00:00:00 [kacpid]

輸出信息中各列說明如下

  • [x] UID:進程被該UID所擁有
  • [x] PID:進程的標識號
  • [x] PPID:進程的父進程的標識號
  • [x] C:CPU使用的資源百分比
  • [x] STIME:進程開始的時間
  • [x] TTY:該進程是在哪個終端機上面運作,若與終端機無關,則顯示“?”,另外,tty1-tty6是本機上面的登入者進程,若爲pts/0等,則表示爲由網絡連接進主機的進程。
  • [x] TIME:進程所使用的總的CPU時間
  • [x] CMD:正在執行的命令行

(3)ps aux

[root@Mr_chen ~]# ps aux
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.0  0.1  19232  1488 ?        Ss   15:00   0:00 /sbin/init
root          2  0.0  0.0      0     0 ?        S    15:00   0:00 [kthreadd]
root          3  0.0  0.0      0     0 ?        S    15:00   0:00 [migration/0]
root          4  0.0  0.0      0     0 ?        S    15:00   0:00 [ksoftirqd/0]
root          5  0.0  0.0      0     0 ?        S    15:00   0:00 [migration/0]
root          6  0.0  0.0      0     0 ?        S    15:00   0:00 [watchdog/0]
root          7  0.0  0.0      0     0 ?        S    15:00   0:00 [events/0]

輸出信息中各列的說明如下

  • [x] USER:該進程屬於的用戶。
  • [x] PID:該進程的進程號。
  • [x] %CPU:該進程使用掉的CPU資源百分比。
  • [x] %MEM:該進程所佔用的物理內存百分比。
  • [x] VSZ:該進程使用掉的虛擬內存量(單位Kbytes)
  • [x] RSS:該進程佔用的固定的內存量(單位Kbytes)
  • [x] TTY:該進程是在哪個終端機上面運作的,若與終端機無關,則顯示“?”,另外,tty1-tty6是本機上面的登入者進程,若爲pts/0等,則表示爲由網絡連接進主機的進程。
  • [x] STAT:該進程目前的狀態,主要的狀態包括如下幾種。
    • R:正在運行,或者是可以運行。
    • S:正在終端睡眠中,可以由某些信號喚醒。
    • D:不可中斷睡眠。
    • T:正在偵測或者是停止了。
    • Z:已經終止,但是其父進程無法正常終止它,從而變成zombie(殭屍)進程的狀態
    • +:前臺進程。
    • l:多線程進程。
    • N:低優先級進程。
    • <:高優先級進程。
    • s:進程領導者。
    • L:已將頁面鎖定到內存中。
  • [x] START:該進程被觸發啓動的時間
  • [x] TIME:該進程實際使用CPU運作的時間
  • [x] COMMAND:該進程的實際命令。

(4)顯示指定用戶的相關進程信息

[root@Mr_chen ~]# ps -u yunjisuan
   PID TTY          TIME CMD
  1315 pts/1    00:00:00 bash
  1335 pts/1    00:00:00 vim

(5) 以詳細格式顯示進程狀態

[root@Mr_chen ~]# ps -u yunjisuan -l
F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S   500   1315   1314  0  80   0 - 27076 n_tty_ pts/1    00:00:00 bash
0 T   500   1335   1315  0  80   0 - 35884 signal pts/1    00:00:00 vim

輸出信息中各列的說明如下

  • [x] F:代表這個進程的標誌(flag),4代表使用者爲super user。
  • [x] S:代表這個進程的狀態(STAT),前面已經講解過了
  • [x] UID:進程被該UID所擁有。
  • [x] PID:進程的標識號。
  • [x] PPID:父進程的ID。
  • [x] C:CPU使用的資源百分比。
  • [x] PRI:Priority(優先執行序)的縮寫
  • [x] NI:Nice值
  • [x] ADDR:指出該進程在內存的哪個部分。如果是個running的進程,則一般是“-”。
  • [x] SZ:使用掉的內存大小。
  • [x] WCHAN:目前這個進程是否正在運作當中,若爲“-”則表示正在運作。
  • [x] TTY:該進程是在哪個終端機上面運作的,若與終端機無關,則顯示“?”,另外,tty1-tty6是本機上面的登入者進程,若爲pts/0等,則表示爲由網絡連接進主機的進程。
  • [x] TIME:該進程實際使用CPU運作的時間
  • [x] CMD:該進程的實際命令

(6)查看某個進程在哪個CPU上運行

[root@Mr_chen ~]# ps -eo pid,args,psr
   PID COMMAND                     PSR
     1 /sbin/init                    0  #CPU標記0代表第一個CPU
     2 [kthreadd]                    0
     3 [migration/0]                 0
     4 [ksoftirqd/0]                 0
     5 [migration/0]                 0
     6 [watchdog/0]                  0
     7 [events/0]                    0
     8 [cgroup]                      0
     9 [khelper]                     0

1.2 kill:終止進程

1.2.1 命令解釋

功能說明

kill命令能夠終止你希望停止的進程

選項說明

參數選項解釋說明(帶@爲重點
-l列出全部的信號名稱
-p指定kill命令只打印相關進程的進程號,而不發送任何信號
-s指定要發送的信號@

1.2.2 使用範例

(1)列出所有信號的名稱

[root@Mr_chen ~]# kill -l
 1) SIGHUP   2) SIGINT   3) SIGQUIT  4) SIGILL   5) SIGTRAP
 6) SIGABRT  7) SIGBUS   8) SIGFPE   9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT   17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG  24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM   27) SIGPROF 28) SIGWINCH    29) SIGIO   30) SIGPWR
31) SIGSYS  34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3
38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7
58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX    
[root@Mr_chen ~]# kill -l kill  #可以使用-l參數對信號名和數字信號互換
9
[root@Mr_chen ~]# kill -l 9
KILL

常用信號:

信號說明
HUP(1)掛起,通常因終端掉線或用戶退出而引發
INT(2)中斷,通常是按下Ctrl+c組合鍵來發出這個信號
QUIT(3)退出,通常是按下CTRL+\組合鍵來發出這個信號
KILL(9)立即結束進程的運行
TERM(15)終止,通常在系統關機時發送
TSTP(20)暫停進程的運行,通常是按下Ctrl+z組合鍵來發出這個信號

(2)終止進程

  • kill指令默認使用的信號爲15,用於結束進程。如果進程忽略此信號,則可以使用信號9強制終止進程。
  • 一般是先通過ps等命令獲取到要終止進程的進程號,然後直接使用“kill 進程號”就可以了。
kill 2203   #kill 命令默認使用的信號爲15,這種格式最常用、
kill -s 15 2203 #這種格式使用-s參數明確指定發送值爲15的信號,效果和kill 2203一樣
kill -15 2203   #上面的-s 15可以簡寫爲-15

如果用上面的方法還是無法終止進程,那麼我們就可以用KILL(9)信號強制終止進程。

kill -9 2203    #信號9會強行終止進程,這會帶來一些副作用,如數據丟失,或者終端無法恢復到正常狀態等,因此應儘量避免使用,除非進程使用其他信號無法終止。

(3)擴展:特殊信號0的應用案例

在kill的所有信號中,有一個十分特殊的信號值0,使用格式爲kill -0 $pid。其中的-0表示不發送任何信號給$pid對應的進程,但是仍然會對$pid是否存在對應的進程進行檢查,如果$pid對應的進程已存在,則返回0,若不存在則返回1。

[root@Mr_chen ~]# pgrep -l sshd
985 sshd
1131 sshd
[root@Mr_chen ~]# kill -s 0 985
[root@Mr_chen ~]# echo $?
0
[root@Mr_chen ~]# kill -s 0 986
bash: kill: (986) - No such process
[root@Mr_chen ~]# echo $?
1

應用:如果同學們想要寫一個管理系統服務的腳本,則可以使用這個技巧。

1.3 killall:通過進程名終止進程

1.3.1 命令解釋

功能說明:

使用kill命令終止進程還需要先獲取進程的pid進程號,這個過程有點繁瑣,而使用killall命令就可以直接用“kill 進程名”這種形式終止進程。

選項說明:

參數選項解釋說明(帶@爲重點
-I不區分大小寫匹配
-g終止屬於該進程組的進程
-i在終止進程之前詢問是否確認
-l列出所有已知的信號名
-q如果沒有進程終止則不提示
-r使用正則表達式匹配要終止的進程名稱
-s用指定的信號代替默認信號
-u終止指定用戶的進程@
-v報告信號是否發送成功
-w等待所有被終止的進程死去。killall每秒都會檢查一次被終止的進程是否仍然存在,其僅在都死光後才返回。注意,如果信號被忽略,或者沒有起作用,或者進程停留在殭屍狀態,那麼killall可能會永久等待@

1.3.2 使用範例

(1)終止定時任務服務進程的例子

首先我們要知道定時任務的進程名是crond,終止該進程的命令如下:

[root@Mr_chen ~]# killall crond
[root@Mr_chen ~]# killall crond #用killall終止進程可執行多次
crond: no process killed    #等看到這個結果說明進程死了
[root@Mr_chen ~]# 
[root@Mr_chen ~]# /etc/init.d/crond start   #啓動服務
Starting crond:                                            [  OK  ]
[root@Mr_chen ~]# killall -w crond  #使用-w參數,會看到等待幾秒後結束命令操作
[root@Mr_chen ~]# killall -w crond
crond: no process killed

(2)終止指定用戶的所有進程

[root@Mr_chen ~]# ps -u yunjisuan -l    #查看普通用戶的所有進程詳細信息
F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S   500   1175   1174  0  80   0 - 27076 wait   pts/1    00:00:00 bash
0 S   500   1210   1175  0  80   0 - 27076 n_tty_ pts/1    00:00:00 bash
0 T   500   1235   1210  0  80   0 - 35884 signal pts/1    00:00:00 vim
[root@Mr_chen ~]# killall -u yunjisuan vim  #殺掉指定用戶的vim進程
[root@Mr_chen ~]# ps -u yunjisuan -l    #成功
F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S   500   1175   1174  0  80   0 - 27076 wait   pts/1    00:00:00 bash
0 S   500   1210   1175  0  80   0 - 27076 n_tty_ pts/1    00:00:00 bash

特別提示:
這種方式可以終止所有歸屬於yunjisuan用戶的vim進程。在之前,我在給同學們講nginx優化時提到過nginx的監牢模式和在和給同學們講解sudo時提到過企業的集權分治策略,他們都是利用普通用戶來啓動服務。此時,我們可以指定用戶殺死該用戶啓動的某一服務的所有進程。

1.4 pkill:通過進程名終止進程

1.4.1 命令解釋

功能說明:

pkill命令可通過進程名終止指定的進程。使用killall終止進程需要連續執行幾次,而pkill可以殺死指定進程及其所有子進程。

選項說明:

參數選項解釋說明(帶@爲重點
-t終端殺死指定終端的進程@
-u用戶殺死指定用戶的進程@

1.4.2 使用範例

(1)通過進程名終止進程

[root@Mr_chen ~]# /etc/init.d/crond status  #查看定時任務程序運行狀態
crond (pid  1274) is running...
[root@Mr_chen ~]# pkill crond   #終止定時任務進程
[root@Mr_chen ~]# /etc/init.d/crond status  
crond dead but subsys locked    #進程被終止

(2)通過終端名終止進程

[root@Mr_chen ~]# w     #第二列TTY就是用戶運行的終端
 15:57:09 up  1:05,  3 users,  load average: 0.00, 0.00, 0.00
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
yunjisua tty1     -                15:55   12.00s  0.02s  0.01s vim ttt
root     pts/0    192.168.200.1    14:51    0.00s  0.07s  0.00s w
root     pts/1    192.168.200.1    15:19    3:28   0.01s  0.00s bash
[root@Mr_chen ~]# ps -u yunjisuan -l    #查看用戶的進程
F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S   500   1175   1174  0  80   0 - 27076 wait   pts/1    00:00:00 bash
0 S   500   1210   1175  0  80   0 - 27076 n_tty_ pts/1    00:00:00 bash
4 S   500   1333   1322  0  80   0 - 27075 wait   tty1     00:00:00 bash
0 S   500   1359   1333  0  80   0 - 35890 poll_s tty1     00:00:00 vim
[root@Mr_chen ~]# pkill -t tty1     #殺掉終端正在運行的進程
[root@Mr_chen ~]# ps -u yunjisuan -l    #vim進程沒了
F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S   500   1175   1174  0  80   0 - 27076 wait   pts/1    00:00:00 bash
0 S   500   1210   1175  0  80   0 - 27076 n_tty_ pts/1    00:00:00 bash
4 S   500   1333   1322  0  80   0 - 27075 n_tty_ tty1     00:00:00 bash
[root@Mr_chen ~]# pkill -9 -t tty1  #強行殺掉tty1終端(踢掉用戶)
[root@Mr_chen ~]# ps -u yunjisuan -l
F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S   500   1175   1174  0  80   0 - 27076 wait   pts/1    00:00:00 bash
0 S   500   1210   1175  0  80   0 - 27076 n_tty_ pts/1    00:00:00 bash
[root@Mr_chen ~]# w     #tty1終端沒了
 15:58:17 up  1:06,  2 users,  load average: 0.00, 0.00, 0.00
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    192.168.200.1    14:51    0.00s  0.08s  0.00s w
root     pts/1    192.168.200.1    15:19    4:36   0.01s  0.00s bash

(3)通過用戶名終止進程

[root@Mr_chen ~]# w
 16:08:24 up  1:16,  3 users,  load average: 0.00, 0.00, 0.00
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
yunjisua tty1     -                16:01    4.00s  0.03s  0.02s -bash
root     pts/0    192.168.200.1    14:51    0.00s  0.09s  0.00s w
root     pts/1    192.168.200.1    15:19   14:43   0.01s  0.00s bash
[root@Mr_chen ~]# ps -u yunjisuan -l    #查看用戶的進程信息
F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S   500   1175   1174  0  80   0 - 27076 wait   pts/1    00:00:00 bash
0 S   500   1210   1175  0  80   0 - 27076 n_tty_ pts/1    00:00:00 bash
4 S   500   1387   1366  0  80   0 - 27076 n_tty_ tty1     00:00:00 bash
0 T   500   1430   1387  0  80   0 - 35883 signal tty1     00:00:00 vim
[root@Mr_chen ~]# pkill -u yunjisuan    #殺掉指定用戶所有進程
[root@Mr_chen ~]# ps -u yunjisuan -l    #成功
F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S   500   1175   1174  0  80   0 - 27076 wait   pts/1    00:00:00 bash
0 S   500   1210   1175  0  80   0 - 27076 n_tty_ pts/1    00:00:00 bash
4 S   500   1387   1366  0  80   0 - 27076 n_tty_ tty1     00:00:00 bash

1.5 top:實時顯示系統中各個進程的資源佔用狀況

1.5.1 命令解釋

功能說明:

top命令用於實時地對系統處理器狀態進行監控,它能夠實時地顯示系統中各個進程的資源佔用狀況。該命令可以按照CPU的使用,內存的使用和執行時間對系統任務進程進行排序顯示,同時top命令還可以通過交互式命令進行設定顯示。

選項說明:

參數選項解釋說明(帶@爲重點
-a將進程按照使用內存排序
-b以批處理的模式顯示進程信息,輸出結果可以傳遞給其他程序或寫入到文件中。在這種模式下,top命令不會接受任何輸入,一直運行直到達到-n選項設置的閾值,或者按Ctrl+C等組合鍵終止程序
-c顯示進程的整個命令路徑,而不是隻顯示命令名稱
-d指定每兩次屏幕信息刷新之間的時間間隔
-H指定這個可以顯示每個線程的情況,否則就是進程的總的狀態
-i不顯示閒置或者僵死的進程信息
-ntop輸出信息更新的次數,完成後將退出top命令
-p顯示指定的進程信息

1.5.2 使用範例

(1)顯示進程信息

root@Mr_chen ~]# top        #使用top命令通常不接任何參數
top - 16:40:31 up  1:48,  3 users,  load average: 0.00, 0.00, 0.00
Tasks:  77 total,   1 running,  76 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   1004412k total,   152112k used,   852300k free,    11312k buffers
Swap:  2031608k total,        0k used,  2031608k free,    42304k cached

   PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                 
     1 root      20   0 19232 1536 1256 S  0.0  0.2   0:00.76 init                      
     2 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kthreadd                  
     3 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 migration/0               
     4 root      20   0     0    0    0 S  0.0  0.0   0:00.01 ksoftirqd/0
  • 第一行,任務隊列信息,同uptime命令的執行結果
    • [x] 16:40:31 當前系統時間
    • [x] up 1:48 系統已經運行了1小時48分
    • [x] 3 users 當前有2個用戶登錄系統
    • [x] load average:0.00, 0.00, 0.00 load average後面三個數分別是1分鐘、5分鐘、15分鐘的平均負載情況
  • 第二行,Tasks爲任務(進程)。從上面的信息可以看出,系統現在共有77個進程,其中處於運行狀態的有1個,76個在休眠(sleep),stoped狀態0個,zombie狀態(僵死)的有0個。
  • 第三行,CPU狀態信息
    • [x] 0.0%us 用戶空間佔用CPU的百分比
    • [x] 0.0%sy 內核空間佔用CPU的百分比
    • [x] 0.0%ni 改變過優先級的進程佔用CPU的百分比
    • [x] 100.0%id 空閒CPU百分比
    • [x] 0.0%wa I/O等待佔用CPU的百分比
    • [x] 0.0%hi 硬中斷(Hardware IRQ)佔用CPU的百分比
    • [x] 0.0%si 軟中斷(Software Interrupts)佔用CPU的百分比
    • [x] 0.0%st 虛擬機佔用CPU的百分比
  • 第四行,內存狀態
    • [x] 1004412k total 物理內存總量
    • [x] 152112k used 使用中的內存總量
    • [x] 852300k free 空閒內存總量
    • [x] 11312k buffers 緩衝的內存量
  • 第五行,swap交換分區信息
    • [x] 2031608k total 交換區總量
    • [x] 0k used 使用的交換區總量
    • [x] 2031608k free 空閒交換區總量
    • [x] 42304k cached 緩存的內存量
  • 第六行,空行
  • 第七行開始,給出的是各進程(任務)的狀態監控
    • [x] PID 進程id
    • [x] USER 進程所有者
    • [x] PR 進程優先級
    • [x] NI nice值,負值表示高優先級,正值表示低優先級。
    • [x] VIRT 進程使用的虛擬內存總量,單位kb。
    • [x] RES 進程使用的、未被換出的物理內存大小,單位爲kb。
    • [x] SHR 共享內存大小,單位爲kb
    • [x] S 進程狀態。D=不可中斷的睡眠狀態 R=運行 S=睡眠 T=跟蹤/停止 Z=殭屍進程
    • [x] %CPU 上次更新到現在的CPU時間佔用百分比
    • [x] %MEM 進程使用的物理內存百分比
    • [x] TIME+ 進程使用的CPU時間總計,單位1/100秒
    • [x] COMMAND 進程名稱(命令名/命令行)

特別提示:
1)計算真正可用的內存數爲:第四行的free+第四行的buffers+第五行的cached
2)在對內存進行監控時,我們要時刻關注top命令裏第五行swap交換分區的used,如果這個數值還在不斷地變化,則說明內核正在不斷進行內存和swap的數據交換,這表示內存真的不夠用了或者程序運行有內存溢出問題。

(2)顯示多核不同核CPU的信息

在top基本視圖中,按鍵盤數字“1”,可監控每個邏輯CPU的狀況。

![1.png-42.8kB][2]

從上圖可以發現,服務器有8個邏輯CPU,實際上是2個物理CPU。再按數字鍵1,就會返回到top基本視圖界面。

(2)將進程按照使用內存排序。

[root@Mr_chen ~]# top -a    #使用參數-a將進程按照使用內存排序
top - 18:07:36 up 42 min,  1 user,  load average: 0.00, 0.00, 0.00
Tasks: 164 total,   1 running, 163 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   1004412k total,   153948k used,   850464k free,    10296k buffers
Swap:  2031608k total,        0k used,  2031608k free,    37868k cached

   PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                 
  1236 root      20   0 98.0m 4036 3056 S  0.0  0.4   0:00.20 sshd                     
  1209 postfix   20   0 81524 3424 2544 S  0.0  0.3   0:00.01 qmgr                     
  1202 root      20   0 81272 3400 2496 S  0.0  0.3   0:00.03 master                   
  1208 postfix   20   0 81352 3380 2504 S  0.0  0.3   0:00.03 pickup  

(3)以批處理模式顯示進程信息

[root@Mr_chen ~]# top -b        #使用參數-b可以看到命令執行結果不停地向下刷新
......
  1229 root      20   0  4064  576  496 S  0.0  0.1   0:00.00 mingetty                 
  1231 root      20   0  4064  576  496 S  0.0  0.1   0:00.00 mingetty                 
  1233 root      20   0  4064  576  496 S  0.0  0.1   0:00.00 mingetty                 
  1235 root      20   0  4064  576  496 S  0.0  0.1   0:00.00 mingetty                 
  1236 root      20   0 98.0m 4036 3056 S  0.0  0.4   0:00.22 sshd                     
  1243 root      18  -2 12344 2580  516 S  0.0  0.3   0:00.00 udevd                    
  1244 root      18  -2 12344 2584  516 S  0.0  0.3   0:00.00 udevd                    
  1248 root      20   0  105m 1876 1520 S  0.0  0.2   0:00.04 bash                     
  1301 root      20   0 17384  668  452 S  0.0  0.1   0:00.00 anacron                  
  1318 root      20   0 15032 1340  984 R  0.0  0.1   0:00.01 top                      
^C  #退出使用快捷鍵Ctrl+C

(4)顯示進程的完整路徑

[root@Mr_chen chen]# top -c #使用參數-c顯示進程的整個命令路徑。
top - 18:19:38 up 54 min,  1 user,  load average: 0.00, 0.00, 0.00
Tasks: 164 total,   1 running, 163 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   1004412k total,   154196k used,   850216k free,    10316k buffers
Swap:  2031608k total,        0k used,  2031608k free,    37904k cached

   PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                 
     1 root      20   0 19232 1484 1220 S  0.0  0.1   0:00.98 /sbin/init               
     2 root      20   0     0    0    0 S  0.0  0.0   0:00.01 [kthreadd]               
     3 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 [migration/0] 

(5) 設置執行top命令後的信息刷新時間

[root@Mr_chen chen]# top -d 3       #使用參數-d指定更新週期爲3秒,也就是說命令結果每隔3s刷新一次

(6)設置執行top命令後的信息刷新次數

[root@Mr_chen chen]# top -n 2   #使用參數-n指定更新次數爲2次,也就是說命令結果刷新兩次後終止退出,-n參數可以和-b參數配合使用

(7)將top輸出結果的全部信息輸出到文件中

[root@Mr_chen chen]# top -b -n1 > test  #以批處理方式,就刷新1次數據重定向到文件裏
[root@Mr_chen chen]# cat test | wc -l
171
[root@Mr_chen chen]# top -n1 > test     #如果不是批處理方式,數據量少
[root@Mr_chen chen]# cat test | wc -l
28

特別提示:
在工作中,如果沒有必要,我們儘量不要在服務器上直接用top無任何參數的方式查看,因爲這樣會非常佔用系統的資源。我們可以使用top -b -n1 > test的方式將數據重定向到文件裏,再進行查看。

(8)顯示指定的進程信息

[root@Mr_chen chen]# top -p 1126    #使用-p選項顯示指定進程號的信息
top - 18:31:18 up  1:06,  1 user,  load average: 0.00, 0.00, 0.00
Tasks:   1 total,   0 running,   1 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   1004412k total,   154032k used,   850380k free,    10448k buffers
Swap:  2031608k total,        0k used,  2031608k free,    38060k cached

   PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                 
  1126 root      20   0 66604 1184  468 S  0.0  0.1   0:00.00 sshd 

(9)顯示指定用戶的信息

[root@Mr_chen chen]# top -u yunjisuan   #使用-u參數顯示指定用戶的進程信息
top - 18:33:05 up  1:08,  2 users,  load average: 0.00, 0.00, 0.00
Tasks: 165 total,   1 running, 164 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   1004412k total,   160388k used,   844024k free,    10796k buffers
Swap:  2031608k total,        0k used,  2031608k free,    41696k cached

   PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                 
  1384 yunjisua  20   0  105m 1896 1528 S  0.0  0.2   0:00.01 bash                     
  1403 yunjisua  20   0  140m 3968 2684 S  0.0  0.4   0:00.01 vim   

1.6 nohup:用戶退出系統進程繼續工作

1.6.1 命令解釋

功能說明:

  • nohup命令可以將程序以忽略掛起信號的方式運行起來,被運行程序的輸出信息將不會顯示到終端。
  • 無論是否將nohup命令的輸出重定向到終端,輸出都將寫入到當前目錄的nohup.out文件中。如果當前目錄的nohup.out文件不可寫,則輸出重定向到$HOME/nohup.out文件中。

1.6.2 使用範例

(1)讓執行的命令在當前會話終止後繼續保持運行。

正常情況下,如果用戶退出登錄或會話終止,則用戶正在執行並可持續一段時間的命令(非守護進程)將自動終止。使用nohup命令可以實現在用戶退出或當前會話終止後繼續保持運行,具體的例子如下:

[root@Mr_chen ~]# cd chen/
[root@Mr_chen chen]# nohup ping www.baidu.com   #讓當前執行的進程始終運行,關閉界面也不消失
nohup: ignoring input and appending output to `nohup.out'
^C[root@Mr_chen chen]# ls
nohup.out  test
[root@Mr_chen chen]# cat nohup.out #命令的執行記錄會被記錄在當前目錄下的nohup.out中
PING www.a.shifen.com (61.135.169.125) 56(84) bytes of data.
64 bytes from 61.135.169.125: icmp_seq=1 ttl=128 time=4.22 ms
64 bytes from 61.135.169.125: icmp_seq=2 ttl=128 time=4.28 ms
64 bytes from 61.135.169.125: icmp_seq=3 ttl=128 time=4.20 ms
64 bytes from 61.135.169.125: icmp_seq=4 ttl=128 time=4.21 ms
64 bytes from 61.135.169.125: icmp_seq=5 ttl=128 time=4.16 ms
64 bytes from 61.135.169.125: icmp_seq=6 ttl=128 time=4.11 ms
64 bytes from 61.135.169.125: icmp_seq=7 ttl=128 time=4.22 ms
64 bytes from 61.135.169.125: icmp_seq=8 ttl=128 time=4.18 ms
64 bytes from 61.135.169.125: icmp_seq=9 ttl=128 time=4.21 ms

--- www.a.shifen.com ping statistics ---
9 packets transmitted, 9 received, 0% packet loss, time 8508ms
rtt min/avg/max/mdev = 4.114/4.203/4.285/0.097 ms

在工作中我們一般會配合&符號運行nohup命令,讓程序直接在後臺運行

[root@Mr_chen chen]# w  #用戶yunjisuan的客戶端已經退出
 05:45:29 up 8 min,  1 user,  load average: 0.00, 0.02, 0.00
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    192.168.200.1    05:37    0.00s  0.12s  0.00s w
[root@Mr_chen chen]# ps -u yunjisuan -l #但是用戶的ping進程還在
F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S   500   1332      1  0  80   0 - 27394 poll_s ?        00:00:00 ping
[root@Mr_chen chen]# tail -f /home/yunjisuan/nohup.out #nohup.out文件一直在記錄信息
64 bytes from 61.135.169.125: icmp_seq=24 ttl=128 time=4.26 ms
64 bytes from 61.135.169.125: icmp_seq=25 ttl=128 time=4.24 ms
64 bytes from 61.135.169.125: icmp_seq=26 ttl=128 time=4.14 ms
64 bytes from 61.135.169.125: icmp_seq=27 ttl=128 time=4.28 ms
64 bytes from 61.135.169.125: icmp_seq=28 ttl=128 time=6.25 ms
64 bytes from 61.135.169.125: icmp_seq=29 ttl=128 time=4.10 ms

1.7 strace:跟蹤進程的系統調用

1.7.1 命令解釋

功能說明

strace是Linux環境下的一款程序調試工具,用於檢查一個應用程序所使用的系統調用以及它所接收的系統信息。strace會追蹤程序運行時的整個生命週期,輸出每一個系統調用的名字、參數、返回值和執行所消耗的時間等,是高級運維和開發人員排查問題的殺手鐗。

選項說明

參數選項解釋說明(帶@爲重點
-c統計每一個系統調用所執行的算時間、次數和出錯的次數等
-d輸出strace關於標準錯誤的調試信息
-f跟蹤目標進程,以及目標進程創建的所有子進程@
-ff如果提供-o filename,則將所有進程的跟蹤結果輸出到相應的filename.pid中,pid是各進程的進程號
-i輸出系統調用的入口指針
-q禁止輸出關於脫離的消息
-r輸出每一個系統調用的相對時間
-t在輸出中的每一行前加上時間信息。例如:16:45:28
-tt在輸出中的每一行前加上時間信息,精確到微秒。例如11:18:59.759546@
-ttt在輸出中的每一行前加上時間信息,精確到微秒,而且時間表示爲UNIX時間戳。例如1486111461.650434
-T顯示每次系統調用所花費的時間
-v對於某些相關調用,把完整的環境變量、文件stat結構等打印出來
-x以十六進制形式輸出非標準字符串
-xx所有字符串以十六進制形式輸出
-o filename將strace的輸出寫入文件filename
-p pid指定要跟蹤的進程pid,要同時跟蹤多個pid,重複多次-p選項即可@
-s strsize指定輸出的字符串的最大長度,默認爲32.並沒有將文件名視爲字符串,默認全部輸出
-u username以username的UID和GID執行所跟蹤的命令

輸出過濾器

參數選項解釋說明(帶@爲重點
-e expr輸出過濾器,通過表達式,可以過濾掉你不想要的輸出@
-e trace=open表示只跟蹤open調用而-e trace!=open表示跟蹤除open外所有
-e trace=file只跟蹤與文件操作有關的系統調用
-e trace=process只跟蹤與進程有關的系統調用
-e trace=network只跟蹤與網絡有關的系統調用
-e trace=signal只跟蹤與系統信號有關的系統調用
-e trace=desc只跟蹤與文件描述符有關的系統調用
-e trace=ipc只跟蹤與進程通信有關的系統調用

1.7.2 使用範例

(1)排查Nginx 403 forbidden錯誤

[root@localhost tmp]# strace -tt -f -o /tmp/test.txt /usr/local/nginx/sbin/nginx     #f參數跟蹤目標進程,以及目標進程創建的所有子進程,-tt參數在輸出中的每一行前加上時間信息,-o將跟蹤內容輸出到文件裏。
[root@localhost tmp]# cat test.txt 
3824  05:37:14.300486 prctl(PR_SET_DUMPABLE, 1) = 0
3824  05:37:14.300498 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
3824  05:37:14.300518 epoll_create(512) = 8
3824  05:37:14.300535 eventfd2(0, 0)    = 9
3824  05:37:14.300549 epoll_ctl(8, EPOLL_CTL_ADD, 9, {EPOLLIN|EPOLLET, {u32=7095968, u64=7095968}}) = 0
3824  05:37:14.300569 mmap(NULL, 233472, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f73714f7000
3824  05:37:14.300607 brk(0x1fa5000)    = 0x1fa5000
3824  05:37:14.300693 epoll_ctl(8, EPOLL_CTL_ADD, 6, {EPOLLIN|0x2000, {u32=1901031440, u64=140133798998032}}) = 0
3824  05:37:14.300712 close(3)          = 0
3824  05:37:14.300724 epoll_ctl(8, EPOLL_CTL_ADD, 7, {EPOLLIN|0x2000, {u32=1901031664, u64=140133798998256}}) = 0
3824  05:37:14.300742 epoll_wait(8,     #epoll_wait表示等待連接訪問,因此後面的輸出都是和前一次訪問有關的,下面我們仔細看一下日誌輸出。

我們先將test.txt文件的內容清空,然後模擬去訪問nginx

[root@localhost tmp]# cat test.txt 
{{EPOLLIN, {u32=1901031440, u64=140133798998032}}}, 512, 4294967295) = 1
3824  05:57:59.271342 accept4(6, {sa_family=AF_INET, sin_port=htons(64469), sin_addr=inet_addr("192.168.0.254")}, [16], SOCK_NONBLOCK) = 3
3824  05:57:59.271383 epoll_ctl(8, EPOLL_CTL_ADD, 3, {EPOLLIN|EPOLLET|0x2000, {u32=1901031888, u64=140133798998480}}) = 0
3824  05:57:59.271401 epoll_wait(8, {{EPOLLIN, {u32=1901031888, u64=140133798998480}}}, 512, 60000) = 1
3824  05:57:59.271423 recvfrom(3, "GET / HTTP/1.1\r\nHost: 192.168.0."..., 1024, 0, NULL, NULL) = 308        #recvfrom接收到get請求
3824  05:57:59.271483 stat("/usr/local/nginx/html/www/index.html", 0x7fff69246350) = -1 ENOENT (No such file or directory)     #查看index.html文件不存在
3824  05:57:59.271506 stat("/usr/local/nginx/html/www", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
3824  05:57:59.271525 stat("/usr/local/nginx/html/www/index.htm", 0x7fff69246350) = -1 ENOENT (No such file or directory)     #查看index.htm文件不存在
#下面向用戶返回403錯誤,並寫入錯誤日誌
3824  05:57:59.271546 write(5, "2018/01/14 05:57:59 [error] 3824"..., 200) = 200
3824  05:57:59.271587 writev(3, [{"HTTP/1.1 403 Forbidden\r\nServer: "..., 155}, {"<html>\r\n<head><title>403 Forbidd"..., 116}, {"<hr><center>nginx/1.10.2</center"..., 53}], 3) = 324
3824  05:57:59.271674 write(4, "192.168.0.254 - - [14/Jan/2018:0"..., 151) = 151
3824  05:57:59.271693 setsockopt(3, SOL_TCP, TCP_NODELAY, [1], 4) = 0
3824  05:57:59.271708 recvfrom(3, 0x1f3e190, 1024, 0, 0, 0) = -1 EAGAIN (Resource temporarily unavailable)
3824  05:57:59.271722 epoll_wait(8, 
#從上面的日誌輸出中,我們可以得知是因爲2個文件不存在導致的403錯誤,因此我們檢查配置文件就很容易發現問題。
    server {
        listen       80;
        server_name  www.yunjisuan.com;
        location / {
            root   html/www;
            index  index.html index.htm;        #這裏缺少了設置首頁文件
        }
    }

(2)只跟蹤與文件操作有關的系統調用

如果命令結果的輸出實在太多了,很容易看花眼,因此可以使用過濾器,過濾掉無關的信息,比如只查看文件操作信息。

[root@localhost tmp]# strace -tt -f -e trace=file -o /tmp/test.txt /usr/local/nginx/sbin/nginx
[root@localhost tmp]# cat test.txt 
3860  06:28:42.306924 stat("/usr/local/nginx/html/www/index.html", 0x7fff3ce39670) = -1 ENOENT (No such file or directory)
3860  06:28:42.306973 stat("/usr/local/nginx/html/www", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
3860  06:28:42.306994 stat("/usr/local/nginx/html/www/index.htm", 0x7fff3ce39670) = -1 ENOENT (No such file or directory)

(3)通過pid跟蹤進程

[root@localhost tmp]# /usr/local/nginx/sbin/nginx   #啓動nginx服務
[root@localhost tmp]# pgrep nginx -l
3873 nginx  #nginx的master進程
3874 nginx  #nginx的worker進程
[root@localhost tmp]# strace -tt -f -e trace=file -p 3874   #使用-p參數,只跟蹤worker進程,結果更加精簡
Process 3874 attached - interrupt to quit
06:49:38.629248 stat("/usr/local/nginx/html/www/index.html", 0x7fffbd4e7fc0) = -1 ENOENT (No such file or directory)
06:49:38.629329 stat("/usr/local/nginx/html/www", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
06:49:38.629353 stat("/usr/local/nginx/html/www/index.htm", 0x7fffbd4e7fc0) = -1 ENOENT (No such file or directory)

(4)跟蹤系統調用統計

strace不僅能夠追蹤系統調用,使用選項-c還能對進程所有的系統調用做一個統計分析

[root@localhost tmp]# strace -c /usr/local/nginx/sbin/nginx     #使用-c參數爲進程所有的系統調用做一個統計分析
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
100.00    0.000047          47         1           clone
  0.00    0.000000           0        29           read
  0.00    0.000000           0        31           open
  0.00    0.000000           0        33           close
  0.00    0.000000           0         6           stat
  0.00    0.000000           0        28           fstat
  0.00    0.000000           0         1           lseek
  0.00    0.000000           0        61           mmap
  0.00    0.000000           0        36           mprotect
  0.00    0.000000           0         7           munmap
  0.00    0.000000           0         6           brk
  0.00    0.000000           0        14           rt_sigaction
  0.00    0.000000           0         1           rt_sigprocmask
  0.00    0.000000           0         1           ioctl
  0.00    0.000000           0         2           pread
  0.00    0.000000           0         2         2 access
  0.00    0.000000           0         5           socket
  0.00    0.000000           0         4         4 connect
  0.00    0.000000           0         1           bind
  0.00    0.000000           0         2           listen
  0.00    0.000000           0         1           setsockopt
  0.00    0.000000           0         1           execve
  0.00    0.000000           0         2           uname
  0.00    0.000000           0         3           fcntl
  0.00    0.000000           0         5         5 mkdir
  0.00    0.000000           0         3           getrlimit
  0.00    0.000000           0         1           geteuid
  0.00    0.000000           0         1           statfs
  0.00    0.000000           0         1           arch_prctl
  0.00    0.000000           0         2         1 futex
  0.00    0.000000           0         1           epoll_create
  0.00    0.000000           0         1           set_tid_address
  0.00    0.000000           0         1           set_robust_list
------ ----------- ----------- --------- --------- ----------------
100.00    0.000047                   294        12 total

上面的結果將清楚地告訴我們調用了哪些系統函數,調用的次數是多少,消耗了多少時間等信息,這對我們分析程序來說是非常有用的。

(5)重定向輸出

[root@localhost tmp]# strace -c -o /tmp/test.txt /usr/local/nginx/sbin/nginx #-o選項將strace的結果輸出到文件中
[root@localhost tmp]# cat test.txt 
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
  -nan    0.000000           0        29           read
  -nan    0.000000           0        31           open
  -nan    0.000000           0        33           close
  -nan    0.000000           0         6           stat

(6)對系統調用進行計時

[root@localhost tmp]# /usr/local/nginx/sbin/nginx -s stop
[root@localhost tmp]# strace -T /usr/local/nginx/sbin/nginx #使用-T將每個系統調用所花費的時間打印出來,每個調用的時間花銷在調用行最右邊的尖括號裏
execve("/usr/local/nginx/sbin/nginx", ["/usr/local/nginx/sbin/nginx"], [/* 24 vars */]) = 0 <0.000075>
brk(0)                                  = 0x1055000 <0.000003>
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbbf84f6000 <0.000004>
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory) <0.000005>
open("/etc/ld.so.cache", O_RDONLY)      = 3 <0.000004>
fstat(3, {st_mode=S_IFREG|0644, st_size=15441, ...}) = 0 <0.000003>
mmap(NULL, 15441, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fbbf84f2000 <0.000003>
close(3)                                = 0 <0.000003>
open("/lib64/libdl.so.2", O_RDONLY)     = 3 <0.000005>
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\340\r\0\0\0\0\0\0"..., 832) = 832 <0.000003>
fstat(3, {st_mode=S_IFREG|0755, st_size=19536, ...}) = 0 <0.000003>
mmap(NULL, 2109696, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fbbf80d4000 <0.000004>
mprotect(0x7fbbf80d6000, 2097152, PROT_NONE) = 0 <0.000004>
......

1.7.3 小結

strace命令很適合處理程序殭屍、命令執行報錯等問題。如果從程序日誌和系統日誌中看不出問題出現的原因,則可以strace一下,也許會有答案,不過也需要使用者有足夠的耐心去查看輸出。

1.8 ltrace :跟蹤進程調用庫函數

1.8.1 命令解釋

功能說明:

ltrace能夠跟蹤進程的庫函數調用,它會顯現出調用了哪個庫函數,而strace則是跟蹤進程的每個系統調用

選項說明:

參數選項解釋說明(帶@爲重點
-c統計庫函數每次調用的時間,最後程序退出時打印摘要
-C解碼低級別名稱(內核級)爲用戶級名稱
-d打印調試信息
-e expr輸出過濾器,通過表達式,可以過濾掉你不想要的輸出@
-e printf表示只查看printf函數調用
-f跟蹤子進程
-o filename將ltrace的輸出寫入文件filename
-p pid指定要跟蹤的進程pid@
-r輸出每一個調用的相對時間
-S顯示系統調用
-t在輸出中每一行前加上時間信息。例如 16:45:28
-tt在輸出中每一行前加上時間信息。例如 11:18:59.759546
-ttt在輸出中每一行前加上時間信息,精確到微妙,而且時間表示爲UNIX時間戳。
-T顯示每次調用所花費時間
-u username以username的UID和GID執行所跟蹤的命令

1.8.2 使用範例

(1)ltrace使用

ltrace的用法與strace非常相似,選項功能也是類似,下面簡單看一下ltrace命令的執行結果

[root@localhost tmp]# ltrace /usr/local/nginx/sbin/nginx    #ltrace後面直接接上要檢測的命令語句
memcpy(0x1d5b7b0, "www.yunjisuan.com", 17)                              = 0x1d5b7b0
memcpy(0x1d5b7c1, "/usr/local/nginx/", 17)                              = 0x1d5b7c1
malloc(2048)                                                            = 0x1d55530
memset(0x1d55530, '\000', 68)                                           = 0x1d55530
memset(0x1d55530, '\000', 70)                                           = 0x1d55530
memset(0x1d55530, '\000', 72)                                           = 0x1d55530
memset(0x1d55530, '\000', 74)                                           = 0x1d55530
memset(0x1d55530, '\000', 76)                                           = 0x1d55530
memset(0x1d55530, '\000', 78)                                           = 0x1d55530
memset(0x1d55530, '\000', 80)                                           = 0x1d55530
memset(0x1d55530, '\000', 82)                                           = 0x1d55530
memset(0x1d55530, '\000', 84)                                           = 0x1d55530
memset(0x1d55530, '\000', 86)                                           = 0x1d55530
......
sigemptyset(0x7fffb75519f8)                                             = 0
sigaction(17, 0x7fffb75519f0, NULL)                                     = 0
sigemptyset(0x7fffb75519f8)                                             = 0
sigaction(31, 0x7fffb75519f0, NULL)                                     = 0
sigemptyset(0x7fffb75519f8)                                             = 0
sigaction(13, 0x7fffb75519f0, NULL)                                     = 0
fork()                                                                  = 3962
[pid 3961] exit(0 <unfinished ...>
[pid 3961] +++ exited (status 0) +++

(2)通過pid跟蹤進程調用庫函數

[root@localhost tmp]# pgrep -l nginx
3967 nginx
3968 nginx          #nginx的worker進程的pid號
[root@localhost tmp]# ltrace -p 3968        使用-p指定進程號
__errno_location()                                                      = 0x7f0a392e1768
gettimeofday(0x7fff8f684cd0, NULL)                                      = 0
memcpy(0x6b281f, "14", 2)                                               = 0x6b281f
memcpy(0x6b2826, "2018", 4)                                             = 0x6b2826
memcpy(0x6b282b, "12", 2)                                               = 0x6b282b
memcpy(0x6b282e, "28", 2)                                               = 0x6b282e
memcpy(0x6b2831, "30", 2)                                               = 0x6b2831
localtime_r(0x7fff8f684c88, 0x7fff8f684d20, 0x48400a, 12339, 0x7fff8f684b52) = 0x7fff8f684d20
memcpy(0x6b22fc, "2018", 4)                                             = 0x6b22fc
memcpy(0x6b2302, "1", 1)                                                = 0x6b2302
memcpy(0x6b2304, "14", 2)                                               = 0x6b2304
memcpy(0x6b2308, "7", 1)                                                = 0x6b2308
memcpy(0x6b230a, "28", 2)                                               = 0x6b230a
memcpy(0x6b230d, "30", 2)                                               = 0x6b230d
memcpy(0x6b2f91, "14", 2)                                               = 0x6b2f91
memcpy(0x6b2f98, "2018", 4)                                             = 0x6b2f98
memcpy(0x6b2f9e, "7", 1)                                                = 0x6b2f9e
memcpy(0x6b2fa0, "28", 2)                                               = 0x6b2fa0
memcpy(0x6b2fa3, "30", 2)                                               = 0x6b2fa3
memcpy(0x6b2fa8, "5", 1)                                                = 0x6b2fa8
memcpy(0x6b2faa, "0", 1)                                                = 0x6b2faa
memcpy(0x6b364e, "2018", 4)                                             = 0x6b364e
memcpy(0x6b3654, "1", 1)                                                = 0x6b3654
memcpy(0x6b3656, "14", 2)                                               = 0x6b3656
memcpy(0x6b365a, "7", 1)                                                = 0x6b365a
memcpy(0x6b365c, "28", 2)                                               = 0x6b365c
memcpy(0x6b365f, "30", 2)                                               = 0x6b365f
memcpy(0x6b3663, "5", 1)                                                = 0x6b3663
memcpy(0x6b3666, "0", 1)                                                = 0x6b3666
memcpy(0x6b3cb4, "14", 2)                                               = 0x6b3cb4
memcpy(0x6b3cb8, "7", 1)                                                = 0x6b3cb8
memcpy(0x6b3cba, "28", 2)                                               = 0x6b3cba
memcpy(0x6b3cbd, "30", 2)                                               = 0x6b3cbd
epoll_wait(8, 0x2639990, 512, 0xffffffff, 0x7fff8f684b52


本文出處:https://www.cnblogs.com/chensiqiqi/p/9163094.html


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