監控系統的運行狀態,而且能夠按照cpu、內存、執行時間進行排序。php
第一行中,03:30:22
是當前時間,up 39 min
是系統運行的運行了多長時間,1 user
指出了當前有幾個用戶登陸到系統,load average
指的是系統負載,這後面的三個值分別是1分鐘,5分鐘,15分鐘的系統負載平均值。html
若是僅僅須要第一行中的信息,可使用
uptime
命令。mysql
第二行中,Task
指出了當前系統有多少個進程,以及各類狀態的進程統計信息。linux
第三行是%Cpu(s)
,表明了CPU佔用比例,其中:ios
ni是優先值(nice value),也就是任務的優先值。優先值爲負數,則說明任務有更高的優先級,正數值說明任務有更低的優先級,該值爲0意味着進程都優先級沒有調整。nginx
最後兩行爲內存信息,前者Mem
爲物理內存佔用信息,後者Swap
爲交換分區佔用信息。redis
使用
-M
參數能夠更加友好的顯示內存佔用信息。默認是以kb展現的,看起來比較費勁,使用-M
以後會根據數值大小,以G/M爲單位展現。sql
最下面是進程的信息區域:shell
參考linux top命令詳解bash
根據名稱或者其它屬性查詢(發送信號)進程信息。
pgrep
命令根據提供的條件查詢進程的pid,查詢條件是and方式的,對於同一個選項,使用『,』分隔能夠按照or方式查詢。
pgrep -u root sshd # 查詢進程名爲sshd,而且屬主是root的進程 pgrep -u root,daemon # 查詢屬主是root或者daemon的進程
pkill
使用與pgrep
相似,不過它不是用來查詢進程pid,而是給進程發送信號,默認會發送 SIGTERM信號。
例如:
$ pgrep -u root named # 查找named進程的pid $ pkill -HUP syslogd # 告訴syslogd從新讀取配置文件
要查看有哪些信號可用,可使用
kill -l
列出全部的信號以及其數值。
#!/usr/bin/expect set timeout 20 set ip "IP地址" set user "用戶名" set password "密碼" spawn ssh "$user\@$ip" expect "$user@$ip's password:" send "$password\r" interact
參考 6 Expect Script Examples to Expect the Unexpected (With Hello World)
pstack
是一個shell腳本,用於打印正在運行的進程的棧跟蹤信息,它其實是gstack
的一個連接。
該命令只須要提供一個參數,進程的pid便可。
$ sudo pstack $(pgrep -uroot php-fpm) [sudo] password for guanyy: #0 0x000000380d8e86f3 in __epoll_wait_nocancel () from /lib64/libc.so.6 #1 0x00000000007ec4a4 in fpm_event_epoll_wait () #2 0x00000000007e1517 in fpm_event_loop () #3 0x00000000007dc887 in fpm_run () #4 0x00000000007e3bd8 in main ()
pstack
是gdb的一部分,若是系統沒有pstack命令,使用yum搜索安裝gdb
便可。
strace
命令用於跟蹤系統調用和信號。主要用於診斷,調試程序,使用該命令可以打印出進程執行的系統調用信息。
在 Mac 下使用
dtruss
命令代替
$ strace php 2>&1 | grep php.ini open("/usr/local/bin/php.ini", O_RDONLY) = -1 ENOENT (No such file or directory) open("/usr/local/lib/php.ini", O_RDONLY) = 4 lstat64("/usr/local/lib/php.ini", {st_mode=S_IFLNK|0777, st_size=27, ...}) = 0 readlink("/usr/local/lib/php.ini", "/usr/local/Zend/etc/php.ini", 4096) = 27 lstat64("/usr/local/Zend/etc/php.ini", {st_mode=S_IFREG|0664, st_size=40971, ...}) = 0
這裏的
2>&1
是將標準錯誤輸出重定向到標準輸出。
$ strace -e open,access 2>&1 |grep your-filename
-e
參數指定了一個限定表達式用於指定要跟蹤的事件和如何跟蹤它們。
[qualifier=][!]value1[,value2]...
這裏的qualifier
可選值爲: trace
, abbrev
, verbose
, raw
, signal
, read
, write
。默認的qualifier
是trace
。
root@dev:~# strace -p 15427 Process 15427 attached - interrupt to quit futex(0x402f4900, FUTEX_WAIT, 2, NULL Process 15427 detached
-p
指定了strace跟蹤的進程的pid,這樣就避免了每次執行strace時須要重啓程序。
root@dev:~# strace -c -p 11084 Process 11084 attached - interrupt to quit Process 11084 detached % time seconds usecs/call calls errors syscall ------ ----------- ----------- --------- --------- ---------------- 94.59 0.001014 48 21 select 2.89 0.000031 1 21 getppid 2.52 0.000027 1 21 time ------ ----------- ----------- --------- --------- ---------------- 100.00 0.001072 63 total
-c
參數用於統計進程作了哪些系統調用,調用的時間統計等,並對這些信息作一個彙總顯示。
$ strace -e poll,select,connect,recvfrom,sendto nc www.news.com 80 sendto(3, "\\24\\0\\0\\0\\26\\0\\1\\3\\255\\373NH\\0\\0\\0\\0\\0\\0\\0\\0", 20, 0, {sa_family=AF_NETLINK, pid=0, groups=00000000}, 12) = 20 connect(3, {sa_family=AF_FILE, path="/var/run/nscd/socket"}, 110) = -1 ENOENT (No such file or directory) connect(3, {sa_family=AF_FILE, path="/var/run/nscd/socket"}, 110) = -1 ENOENT (No such file or directory) ...
該命令用於建立任意的TCP/UDP鏈接或者是監聽鏈接。
在Server1上,使用nc命令建立一個服務端:
server1 $ nc -l 1234
在Server2上,使用nc做爲客戶端鏈接到server1
server2 $ nc server1的IP地址 1234
這樣就創建起一個簡單的C/S鏈接,在server2中輸入任何內容,在server1均可以接受到(同步顯示)。
上面的例子能夠改造實現文件遠程發送
server1 $ nc -l 1234 > filename.out
在server2上
server2 $ nc server1的IP地址 1234 < filename.in
-l
指定了nc應該做爲server端監聽指定的端口
# echo -n "GET / HTTP/1.0\r\n\r\n" | nc php.net 80 HTTP/1.1 400 Bad Request Server: nginx/1.6.2 Date: Tue, 16 Dec 2014 08:09:35 GMT Content-Type: text/html Content-Length: 172 Connection: close <html> <head><title>400 Bad Request</title></head> <body bgcolor="white"> <center><h1>400 Bad Request</h1></center> <hr><center>nginx/1.6.2</center> </body> </html>
端口掃描的做用仍是比較大的,使用nc
能夠方便的進行端口掃描。
# nc -z letv.com 1-100 Connection to letv.com 22 port [tcp/ssh] succeeded! Connection to letv.com 80 port [tcp/http] succeeded!
這裏的1-100
指定了掃描的端口範圍,-z
參數告訴nc命令只報告開放的端口。
默認
nc
命令發送的是tcp請求,經過指定參數-u
能夠發送udp請求。
下面例子中,將server2的phpredis-master目錄拷貝到server1。
server1:
# nc -l 1234|tar zxvf -
server2:
# tar zcvf - phpredis-master|nc server1的IP地址 1234
該命令用於顯示進程樹,以樹的形式顯示正在運行的進程,樹的根節點是指定的pid(忽略則爲init進程)。
[root@cdn ~]# pstree -p $(pgrep -uroot php-fpm) php-fpm(5445)─┬─php-fpm(5446) ├─php-fpm(5447) ├─php-fpm(5448) ├─php-fpm(7540) ├─php-fpm(21639) └─php-fpm(24727)
ss
命令用於顯示socket的統計信息。
-s
選項用於顯示彙總信息。
# ss -s Total: 247 (kernel 290) TCP: 214 (estab 68, closed 130, orphaned 0, synrecv 0, timewait 130/0), ports 135 Transport Total IP IPv6 * 290 - - RAW 0 0 0 UDP 11 7 4 TCP 84 81 3 INET 95 88 7 FRAG 0 0 0
-l
選項用於列出當前正在監聽的socket。
# ss -l State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 127.0.0.1:smux *:* LISTEN 0 128 127.0.0.1:9000 *:* LISTEN 0 50 *:3306 *:* LISTEN 0 1024 :::11211 :::*
使用ss -pl
能夠查看使用網絡端口的進程名稱,這裏的-p
選項用於顯示進程信息。
# ss -pl State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 127.0.0.1:smux *:* users:(("snmpd",1256,8)) LISTEN 0 50 *:3306 *:* users:(("mysqld",17651,10)) LISTEN 0 1024 :::11211 :::* users:(("memcached",1849,34)) LISTEN 0 1024 *:11211 *:* users:(("memcached",1849,33)) LISTEN 0 511 127.0.0.1:6379 *:* users:(("redis-server",1403,4))
使用
ss -pl|grep 端口號
查看端口被那個進程佔用。
參數-a
(--all
)用於顯示全部的socket,-t
指的是TCP, -u
是UDP, -w
是RAW, -x
是UNIX。
# ss -t -a # ss -u -a # ss -w -a # ss -x -a
參考ss: Display Linux TCP / UDP Network and Socket Information
w
命令用於查看當前哪些用戶登陸到系統和他們正在作什麼,who
命令僅用於查看哪些用戶登陸系統。
# w 15:39:08 up 126 days, 22:35, 3 users, load average: 0.02, 0.05, 0.02 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root pts/0 10.58.92.228 13:29 1:35m 0.03s 0.03s -bash root pts/1 10.58.93.56 10:32 5:06m 0.00s 0.00s -bash root pts/4 10.58.88.20 12:29 0.00s 0.20s 0.00s w # who root pts/0 2014-12-18 13:29 (10.58.92.228) root pts/1 2014-12-18 10:32 (10.58.93.56) root pts/4 2014-12-18 12:29 (10.58.88.20)
報告CPU的統計信息,設備、分區、網絡文件系統(NFS)的I/O統計信息。
# iostat Linux 2.6.32-903.279.9.1.el6.x86_64 (localhost) 2014年12月18日 _x86_64_ (2 CPU) avg-cpu: %user %nice %system %iowait %steal %idle 0.35 0.00 0.34 0.42 0.15 98.74 Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn vda 4.01 0.35 56.76 3866731 622586087 dm-0 3.29 0.09 26.33 989378 288796192 dm-1 3.45 0.05 27.60 554922 302727584 dm-2 0.32 0.21 2.83 2296845 31060799
這裏對幾個性能指標進行解釋:
經過指定
-d
參數能夠設定自動按照指定時間間隔顯示統計信息。例如,下列命令每隔2s顯示一次。
$ iostat -d 2
交互式的IP網絡實時監控工具,圖形化界面,比較方便。
# iptraf
界面以下:
參考20 Linux System Monitoring Tools Every SysAdmin Should Know