標籤:blog http ar io color os 使用 sp for
top命令
監控系統的運行狀態,並且可以按照cpu、記憶體、執行時間進行排序。
第一行中,03:30:22是目前時間,up 39 min是系統啟動並執行運行了多長時間,1 user指出了當前有幾個使用者登入到系統,load average指的是系統負載,這後面的三個值分別是1分鐘,5分鐘,15分鐘的系統負載平均值。
如果僅僅需要第一行中的資訊,可以使用uptime命令。
第二行中,Task指出了當前系統有多少個進程,以及各種狀態的進程統計資訊。
第三行是%Cpu(s),代表了CPU佔用比例,其中:
- us 使用者模式(user mode)
- sy 系統模式(system mode)
- ni 優先值(low priority user mode(nice))
- id 空閑CPU百分比(idle task)
- wa 等待輸入輸出的CPU事件百分比(I/O waiting)
- hi servicing IRQs
- si servicing soft IRQs
- st steal (time given to other DomU instances)
ni是優先值(nice value),也就是任務的優先值。優先值為負數,則說明任務有更高的優先順序,正數值說明任務有更低的優先順序,該值為0意味著進程都優先順序沒有調整。
最後兩行為記憶體資訊,前者Mem為實體記憶體佔用資訊,後者Swap為交換分區佔用資訊。
使用-M參數可以更加友好的顯示記憶體佔用資訊。預設是以kb展示的,看起來比較費勁,使用-M之後會根據數值大小,以G/M為單位展示。
最下面是進程的資訊地區:
- PID 進程的PID
- USER 使用者名稱,任務屬主
- PR 任務的優先順序
- NI 優先值
- VIRT 虛擬映像(kb),任務當前使用的虛擬記憶體數量
- RES 常駐實體記憶體佔用量,RES=CODE+DATA
- SHR 共用記憶體大小(kb)
- S 進程狀態(D-不可中斷的睡眠,R-運行,S-睡眠,T-停止,Z-殭屍進程)
- %CPU CPU使用量
- %MEM 記憶體使用量量
- TIME+ CPU時間,百分之一
- COMMAND 程式名稱
參考linux top命令詳解
pgrep/pkill 命令
根據名稱或者其它屬性查詢(發送訊號)進程資訊。
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列出所有的訊號以及其數值。
except命令
- send 發送一個字串給進程。
- expect 等待來自進程返回的字串。
- spawn 開始一個命令。
實現控制台SSH直接登陸Linux伺服器
#!/usr/bin/expectset timeout 20set ip "IP地址"set user "使用者名稱"set password "密碼"spawn ssh "$user\@$ip"expect "[email protected]$ip‘s password:"send "$password\r"interact
參考 6 Expect Script Examples to Expect the Unexpected (With Hello World)
pstack命令
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 ()
strace命令
strace命令用於跟蹤系統調用和訊號。主要用於診斷,偵錯工具,使用該命令能夠列印出進程執行的系統調用資訊。
找出應用程式啟動時讀取的設定檔
$ strace php 2>&1 | grep php.iniopen("/usr/local/bin/php.ini", O_RDONLY) = -1 ENOENT (No such file or directory)open("/usr/local/lib/php.ini", O_RDONLY) = 4lstat64("/usr/local/lib/php.ini", {st_mode=S_IFLNK|0777, st_size=27, ...}) = 0readlink("/usr/local/lib/php.ini", "/usr/local/Zend/etc/php.ini", 4096) = 27lstat64("/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。
查看進程正在執行什麼操作
[email protected]:~# strace -p 15427Process 15427 attached - interrupt to quitfutex(0x402f4900, FUTEX_WAIT, 2, NULL Process 15427 detached
-p指定了strace跟蹤的進程的pid,這樣就避免了每次執行strace時需要重啟程式。
查看進程的哪些操作比較耗時
[email protected]:~# strace -c -p 11084Process 11084 attached - interrupt to quitProcess 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參數用於統計進程做了哪些系統調用,調用的時間統計等,並對這些資訊做一個匯總顯示。
查看為什麼xxx無法串連到伺服器
$ strace -e poll,select,connect,recvfrom,sendto nc www.news.com 80sendto(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) = 20connect(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)...
參考5 simple ways to troubleshoot using Strace
nc命令
該命令用於建立任意的TCP/UDP串連或者是監聽串連。
建立一個基本的C/S模型(檔案遠程複製)
在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端監聽指定的連接埠
類比HTTP請求
# echo -n "GET / HTTP/1.0\r\n\r\n" | nc aicode.cc 80HTTP/1.1 400 Bad RequestServer: nginx/1.6.2Date: Tue, 16 Dec 2014 08:09:35 GMTContent-Type: text/htmlContent-Length: 172Connection: 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-100Connection 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
參考Linux nc命令詳解
pstree命令
該命令用於顯示進程樹,以樹的形式顯示正在啟動並執行進程,樹的根節點是指定的pid(忽略則為init進程)。
[[email protected] ~]# 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命令
ss命令用於顯示socket的統計資訊。
顯示socket的匯總資訊
-s選項用於顯示匯總資訊。
# ss -sTotal: 247 (kernel 290)TCP: 214 (estab 68, closed 130, orphaned 0, synrecv 0, timewait 130/0), ports 135Transport Total IP IPv6* 290 - -RAW 0 0 0UDP 11 7 4TCP 84 81 3INET 95 88 7FRAG 0 0 0
查看所有開啟的網路連接埠
-l選項用於列出當前正在監聽的socket。
# ss -lState 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 -plState 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 連接埠號碼查看連接埠被那個進程佔用。
顯示所有的TCP/UDP Socket
參數-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命令用於查看當前哪些使用者登入到系統和他們正在做什麼,who命令僅用於查看哪些使用者登入系統。
# w 15:39:08 up 126 days, 22:35, 3 users, load average: 0.02, 0.05, 0.02USER TTY FROM [email protected] IDLE JCPU PCPU WHATroot pts/0 10.58.92.228 13:29 1:35m 0.03s 0.03s -bashroot pts/1 10.58.93.56 10:32 5:06m 0.00s 0.00s -bashroot pts/4 10.58.88.20 12:29 0.00s 0.20s 0.00s w# whoroot 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)
iostat
報告CPU的統計資訊,裝置、分區、網路檔案系統(NFS)的I/O統計資訊。
# iostatLinux 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.74Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtnvda 4.01 0.35 56.76 3866731 622586087dm-0 3.29 0.09 26.33 989378 288796192dm-1 3.45 0.05 27.60 554922 302727584dm-2 0.32 0.21 2.83 2296845 31060799
這裡對幾個效能指標進行解釋:
- tps 每秒發送的I/O請求數
- Blk_read/s 每秒讀取的block數
- Blk_wrtn/s 每秒寫入的block數
- Blk_read 讀取的block數
- Blk_wrtn 寫入的block數
通過指定-d參數可以設定自動按照指定時間間隔顯示統計資訊。例如,下列命令每隔2s顯示一次。
$ iostat -d 2
iptraf 命令:即時網路統計
互動IP網路即時監控工具,圖形化介面,比較方便。
# iptraf
介面如下:
參考20 Linux System Monitoring Tools Every SysAdmin Should Know
實用Linux命令集錦(一)