實用linux命令(一)

top命令

監控系統的運行狀態,而且能夠按照cpu、內存、執行時間進行排序。php

監控界面

第一行中,03:30:22是當前時間,up 39 min是系統運行的運行了多長時間,1 user指出了當前有幾個用戶登陸到系統,load average指的是系統負載,這後面的三個值分別是1分鐘,5分鐘,15分鐘的系統負載平均值。html

若是僅僅須要第一行中的信息,可使用uptime命令。mysql

第二行中,Task指出了當前系統有多少個進程,以及各類狀態的進程統計信息。linux

第三行是%Cpu(s),表明了CPU佔用比例,其中:ios

  • 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意味着進程都優先級沒有調整。nginx

最後兩行爲內存信息,前者Mem爲物理內存佔用信息,後者Swap爲交換分區佔用信息。redis

使用-M參數能夠更加友好的顯示內存佔用信息。默認是以kb展現的,看起來比較費勁,使用-M以後會根據數值大小,以G/M爲單位展現。sql

最下面是進程的信息區域:shell

  • 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命令詳解bash

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/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命令

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命令

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。默認的qualifiertrace

查看進程正在執行什麼操做
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參數用於統計進程作了哪些系統調用,調用的時間統計等,並對這些信息作一個彙總顯示。

查看爲何xxx沒法鏈接到服務器
$ 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)
...

參考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 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

參考Linux nc命令詳解

pstree命令

該命令用於顯示進程樹,以樹的形式顯示正在運行的進程,樹的根節點是指定的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命令

ss命令用於顯示socket的統計信息。

顯示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 端口號查看端口被那個進程佔用。

顯示全部的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.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)

iostat

報告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

這裏對幾個性能指標進行解釋:

  • 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

界面以下:
iptraf

參考20 Linux System Monitoring Tools Every SysAdmin Should Know

相關文章
相關標籤/搜索