Linux常用命令總結

列舉平時常用但不易記住的Linux命令,工欲善其事,必先利其器,掌握了這些常用的工具命令就會在工作學習中得心應手。每掌握一個新的命令或者選項,可能你就會發現新的天地,加之不同命令的組合(管道)和重定向,必會受益匪淺。

top

top 命令用於動態查看系統的進程信息。top的輸出分爲上部的綜述信息及下部的任務列表信息。

➜   top    
top - 16:42:10 up 28 days,  1:33,  5 users,  load average: 0.54, 0.83, 0.95
Tasks: 383 total,   1 running, 331 sleeping,   0 stopped,   0 zombie
%Cpu(s):  3.1 us,  1.3 sy,  0.0 ni, 91.9 id,  3.6 wa,  0.0 hi,  0.2 si,  0.0 st
KiB Mem : 16207712 total,  6220896 free,  8091128 used,  1895688 buff/cache
KiB Swap: 16557052 total, 11717176 free,  4839876 used.  7169268 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                            
 9807 storm     20   0 1240256 132344  39220 S   1.3  0.8   2:16.22 sublime_text                                                                       
16901 storm     20   0 3563824  80832  11560 S   1.0  0.5 147:04.65 mysql-workbench                                                                    
29806 storm     20   0 1493396 166300  43012 S   1.0  1.0 227:12.95 chromium-browse                                                                    
11794 storm     20   0   42080   3820   2968 R   0.7  0.0   0:02.40 top                                                                                
    8 root      20   0       0      0      0 I   0.3  0.0  59:51.17 rcu_sched                                                                          
  223 root      20   0       0      0      0 S   0.3  0.0  10:42.25 jbd2/sda2-8                                                                        
  249 root       0 -20       0      0      0 I   0.3  0.0   0:01.81 kworker/3:1H                                                                       
 5355 storm     25   5 7293144 1.083g   6828 S   0.3  7.0   2:00.27 java                                                                               
 9243 mysql     20   0 2289984  68336   3656 S   0.3  0.4 435:16.33 mysqld                                                                             
10821 storm     20   0 3565716 135776   6840 S   0.3  0.8   6:37.23 java                                                                               
19014 storm     20   0 3115864 150332  48100 S   0.3  0.9 193:51.63 chromium-browse

綜述信息包括:
(1)系統運行的時間,和uptime命令輸出一樣,比如這裏的 16:42:10 up 28 days, 1:33 表示當前時間是 16:42:10 ,運行了28天1小時33分。

(2)會話個數,比如這裏的 5 users,表示當前有5個會話連接,可以用who命令看到具體情況。

(3)系統負載,系統在過去1分鐘,5分鐘,15分鐘的平均負載,==如果平均負載值超過了CPU的個數(可以使用nproc或者 cat /proc/cpuinfo 命令看)就說明負載很重了,要重視。==

(4)處於運行、睡眠、停止、殭屍狀態的進程數量統計。

(5)CPU使用情況,us,sy分別表示CPU在用戶空間和內核空間花費的時間,用於執行修改了nice值得進程花費的時間會顯示在ni這裏,id表示CPU空閒時間,wa表示等待IO完成消耗的時間,hi,si分別表示CPU用於處理硬中斷,軟終端所用時間,st表示在虛擬化環境中,一個虛擬CPU等待真實CPU的時間(因爲Hypervisor在服務另一個虛擬處理器),CPU資源被Hypervisor偷去了(Steal Time)。

(6)內存及交換分區使用情況,總共有多少,使用了多少,空閒多少。

接下來看任務列表信息欄,表頭的各個字段含義爲:

PID USER PR NI VIRT RES SHR %MEM S %CPU TIME+ COMMAND
進程ID 進程所屬用戶 調度優先級 nice值 虛擬內存大小 使用的物理內存 共享內存 使用內存的比例 進程狀態 CPU份額 CPU時間(秒) 具體的命令

常用1:根據資源使用情況排序進程列表

top 之後可以通過以下鍵實現對應的排序,默認是降序,可以使用R反轉。也可以使用 top -o %CPU 指定排序的列。

M : 根據內存使用量排序

P : 根據CPU使用排序

N : 根據進程ID號排序

T : 根據運行時長排序

常用2:列出線程

通過H鍵來控制是否列出線程,列出線程後綜述信息中也會多出線程的統計信息。也可以運行top命令時指定選項 top -H 。

常用3:列出命令的完整路徑

通過c鍵來控制是否列出命令對應的完整路徑。

常用4:列出特定用戶的進程

通過u鍵,可以輸入用戶名,列出從屬的進程信息。也可以運行top命令時指定選項,如 top -u root 。

常用5:根據各種條件過濾進程

通過O鍵,可以各種條件來一層層過濾得到自己關注的進程,比如 COMMAND=java 得到命令包含java的進程,%CPU>3.0 得到CPU佔用大於3的進程。

常用6:查看一個進程對應的線程 top -H -p PID

ps

ps命令用於輸出當前系統的進程信息,和top的持續輸出不同,ps輸出的是一個快照。

常用:列出所有進程

➜  ~ps -ef 
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 15:22 ?        00:00:01 /sbin/init splash
root         2     0  0 15:22 ?        00:00:00 [kthreadd]
root         4     2  0 15:22 ?        00:00:00 [kworker/0:0H]
root         6     2  0 15:22 ?        00:00:00 [mm_percpu_wq]
storm     5892 21695  0 17:28 pts/36   00:00:00 less 3D_spatial_network.txt
......

-e:所有進程,等同於 -A。
-f:可以看到更多的信息,比如完整的程序名。

lsof

lsof(list open files)可以列出系統打開的文件描述符(包括普通文件,網絡端口號,管道等),也十分強大。在下面的匹配模式中,^開頭都表示非,相反的模式。

常用1:列出以特定字符串開頭的進程打開的文件情況

➜   sudo lsof -c mysql
[sudo] password for storm: 
COMMAND     PID  USER   FD      TYPE             DEVICE SIZE/OFF     NODE NAME
mysqld     9243 mysql  cwd       DIR                8,2     4096 38283055 /var/lib/mysql
mysqld     9243 mysql  rtd       DIR                8,2     4096        2 /
mysqld     9243 mysql  txt       REG                8,2 24895464 46140873 /usr/sbin/mysqld
mysqld     9243 mysql  DEL       REG               0,18             49257 /[aio]
mysqld     9243 mysql  DEL       REG               0,18             49256 /[aio]
mysqld     9243 mysql  DEL       REG               0,18             49255 /[aio]

常用2:特定進程打開的文件

➜  ~ lsof -p 9305
COMMAND  PID  USER   FD      TYPE             DEVICE SIZE/OFF     NODE NAME
java    9305 storm  cwd       DIR                8,2     4096 56235542 /home/storm
java    9305 storm  rtd       DIR                8,2     4096        2 /
java    9305 storm  txt       REG                8,2     7414 13239133 /home/storm/dev/idea-IU-182.3684.101/jre64/bin/java
java    9305 storm  mem       REG                8,2    31312 46146073 /usr/lib/x86_64-linux-gnu/libnotify.so.4.0.0
java    9305 storm  mem       REG                8,2 65012836 46268507 /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/rt.jar

常用3:列出網絡連接信息,top -i [i],i用於給定要匹配的地址模式

➜  ~ lsof -i
COMMAND     PID  USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
java       6983 storm   32u  IPv6  362378      0t0  UDP *:38183 
java       6983 storm   33u  IPv6  363325      0t0  TCP *:http-alt (LISTEN)
java       9305 storm   21u  IPv4 3089042      0t0  TCP localhost:37877->localhost:35762 (ESTABLISHED)
.....
➜  ~ lsof -i tcp
COMMAND     PID  USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
java       6983 storm   33u  IPv6  363325      0t0  TCP *:http-alt (LISTEN)
java       9305 storm   21u  IPv4 3089045      0t0  TCP localhost:37877->localhost:35766 (ESTABLISHED)
....
➜  ~ lsof -i udp 
COMMAND     PID  USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
java       6983 storm   32u  IPv6  362378      0t0  UDP *:38183 
chromium- 19014 storm  118u  IPv4 2483939      0t0  UDP *:mdns 
➜  ~ lsof -i tcp:37877
COMMAND  PID  USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
java    9305 storm   21u  IPv4 3090619      0t0  TCP localhost:37877->localhost:35772 (ESTABLISHED)
java    9305 storm  261u  IPv4 2323357      0t0  TCP *:37877 (LISTEN)
java    9451 storm   77u  IPv6 3089068      0t0  TCP localhost:35772->localhost:37877 (ESTABLISHED)
➜  ~ lsof -i udp:38183
COMMAND  PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
java    6983 storm   32u  IPv6 362378      0t0  UDP *:38183

常用4:恢復誤刪除的文件

一個文件如果正在被進程使用(沒有close),誤刪後,可以被恢復。一種常見的情況是一個正在被使用的日誌文件,被刪除了,但是句柄沒有被釋放,佔用的磁盤空間並沒有得到釋放,此時可以先恢復,然後 cat ” > /path/to/log,或者直接kill掉進程。

PID=27878的進程此時使用了less打開了文件3D_spatial_network.txt。

➜  ~ lsof -c less                                         
COMMAND   PID  USER   FD   TYPE DEVICE SIZE/OFF     NODE NAME
less    27878 storm  cwd    DIR    8,2     4096 56235542 /home/storm
less    27878 storm  rtd    DIR    8,2     4096        2 /
less    27878 storm  txt    REG    8,2   170728 45875271 /bin/less
less    27878 storm  mem    REG    8,2  2981280 46137392 /usr/lib/locale/locale-archive
less    27878 storm  mem    REG    8,2  1868984 44307626 /lib/x86_64-linux-gnu/libc-2.23.so
less    27878 storm  mem    REG    8,2   167240 44307045 /lib/x86_64-linux-gnu/libtinfo.so.5.9
less    27878 storm  mem    REG    8,2   162632 44307624 /lib/x86_64-linux-gnu/ld-2.23.so
less    27878 storm    0u   CHR 136,20      0t0       23 /dev/pts/20
less    27878 storm    1u   CHR 136,20      0t0       23 /dev/pts/20
less    27878 storm    2u   CHR 136,20      0t0       23 /dev/pts/20
less    27878 storm    3r   CHR    5,0      0t0       13 /dev/tty
less    27878 storm    4r   REG    8,2 20673913 56235819 /home/storm/3D_spatial_network.txt

現在刪除3D_spatial_network.txt文件後,可以在lsof中看到。

➜  ~ rm 3D_spatial_network.txt 
➜  ~ lsof -c less             
COMMAND   PID  USER   FD   TYPE DEVICE SIZE/OFF     NODE NAME
less    27878 storm  cwd    DIR    8,2     4096 56235542 /home/storm
less    27878 storm  rtd    DIR    8,2     4096        2 /
less    27878 storm  txt    REG    8,2   170728 45875271 /bin/less
less    27878 storm  mem    REG    8,2  2981280 46137392 /usr/lib/locale/locale-archive
less    27878 storm  mem    REG    8,2  1868984 44307626 /lib/x86_64-linux-gnu/libc-2.23.so
less    27878 storm  mem    REG    8,2   167240 44307045 /lib/x86_64-linux-gnu/libtinfo.so.5.9
less    27878 storm  mem    REG    8,2   162632 44307624 /lib/x86_64-linux-gnu/ld-2.23.so
less    27878 storm    0u   CHR 136,20      0t0       23 /dev/pts/20
less    27878 storm    1u   CHR 136,20      0t0       23 /dev/pts/20
less    27878 storm    2u   CHR 136,20      0t0       23 /dev/pts/20
less    27878 storm    3r   CHR    5,0      0t0       13 /dev/tty
less    27878 storm    4r   REG    8,2 20673913 56235819 /home/storm/3D_spatial_network.txt (deleted)  // 這裏
➜  ~ ls -alh 3D_spatial_network.txt
ls: cannot access '3D_spatial_network.txt': No such file or directory

可以根據PID和FD(文件描述符)來恢復文件。

➜  ~ cp /proc/27878/fd/4 3D_spatial_network.txt
➜  ~ ls -alh 3D_spatial_network.txt
-rw-rw-r-- 1 storm storm 20M Aug 29 15:54 3D_spatial_network.txt

netstat

netstat是查看網絡端口情況的必備命令。

常用:列出所有的TCP,UDP端口占用情況

➜  ~ netstat -atunp 
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      -               
....
udp        0      0 0.0.0.0:68              0.0.0.0:*                           -               
udp6       0      0 :::33527                :::*                                1366/java                     

-a(–all):顯示包括LISTEN狀態的連接,默認沒有。

-t(–tcp):TCP連接。

-u(–udp):UDP連接。

-n(–numeric):顯示數字形式的地址,比如 localhost:mysql 會展示爲 127.0.0.1:3306。

-l(–listening):僅顯示處於監聽狀態的套接字。

-p(–program): 顯示PID和程序名。

grep

grep(Global Regular Expression Print的縮寫)命令是一個強大的文本搜索工具,它使用正則表達式搜索文本,並把匹配的行輸出。

常用1:在文件中查找特定的字符串

➜  ~ grep  'linux' 1.log  
hello linux
➜  ~ grep -n -e 'linux' 1.log 2.log
1.log:1:hello linux
2.log:2:linux is a great os

-e(–regexp=PATTERN):指定要匹配的模式,如果要搜索多種模式,則形如 -e ‘pattern1’ -e ‘pattern’,否則會把後面的當做文件名。

-n:顯示匹配的行所處的行號。

常用2:利用管道,在其他命令的輸出中查找

最常見的是和cat,tail配合使用。

➜  ~ cat 3D_spatial_network.txt| grep 94532185752113
42991635,8.5053563,57.045265,7.94532185752113

常用3:輸出匹配行的前面幾行(-B),後面幾行(-A)上下文

➜  ~ cat 3D_spatial_network.txt| grep 94532185752113 -A 3 -B 3
42991632,8.560503,57.0228637,23.5659512030544
42991632,8.5595327,57.0230085,23.0573080298429
42991634,8.5052981,57.0427326,9.32131212369931
42991635,8.5053563,57.045265,7.94532185752113
42991635,8.5038165,57.0452699,6.83530187642383
42991636,8.5038165,57.0452699,7.03679520220392
42991637,8.5058627,57.0443316,8.86855661728298

常用4:在目錄中查找特定的文本

-r(–recursive):遞歸處理目錄。

➜  ~ grep -nr 'simple' logs 
logs/1.log:4:simple is beauty

df

df命令用於查看文件系統中各個掛載點的磁盤空間使用情況。

常用1:以易讀方式輸出

➜  ~ df -h      
Filesystem      Size  Used Avail Use% Mounted on
udev            7.8G     0  7.8G   0% /dev
tmpfs           1.6G   89M  1.5G   6% /run
/dev/sda2       901G  427G  428G  50% /

常用2:列出inode使用情況,有時候會出現磁盤空間未滿,inode不足,可能是因爲小文件太多,取決於虛擬主機的inode的配額。

➜  ~ df -ih 
Filesystem     Inodes IUsed IFree IUse% Mounted on
udev             2.0M   509  2.0M    1% /dev
tmpfs            2.0M   808  2.0M    1% /run
/dev/sda2         58M  605K   57M    2% /

du

du命令用於顯示某目錄下各個文件或文件夾佔用的磁盤空間大小。

常用:du -ah -d 1

➜  test du -ah -d 1
4.0K    ./editDistance.go
20M ./3D_spatial_network.txt
4.0K    ./hamming.go
4.0K    ./simHashTest.go
116M    ./src
136M    .

-a(–all) : 顯示所有文件情況,而不僅僅是文件夾。

-h(–human-readable):佔用的磁盤空間大小會轉化爲以KB,MB爲單位,而不是字節。

-d(–max-depth=N):對於目錄,可以指定遞歸的深度。

find

find命令是查找文件的利器。

常用:刪除n天之前的文件

find /path/to/directory/ -mindepth 1 -mtime +5 -delete

也可以使用:

find /path/to/dir -mtime +5 | xargs rm -rf

find 常用的選項有:

-name:指定要尋找的文件名符合的模式。

-i: 忽略大小寫。

-maxdepth:要遞歸的最大深度, -mindepth指定最小深度。

-mtime:指定修改時間在n天之前(+n),或在n天之內(-n)。

ls

常用:統計一個目錄下文件個數

ls -1 folder | wc -l  

-1:注意是數字1,表示一個文件佔一行

ln

常用:創建符號鏈接(軟鏈接)

➜  ~ cat 'hello' > hello
➜  ~ ln -s hello hello2
➜  ~ ls -alh hello2
lrwxrwxrwx 1 storm storm 5 Aug 31 15:20 hello2 -> hello 

-s(–symbolic):軟鏈接 hello2 會指向原文件 hello

scp

常用:拷貝文件到服務器,或者相反

C:\Users\vonzh>scp -P 22 D:\\log.txt storm@10.240.209.160:/tmp
storm@10.240.209.160's password:
log.txt                                                                               100% 2316KB   2.3MB/s   00:00

-P:指定目標主機SSH端口號。另一種實現文件拷貝的方式是==採用Python提供的SimpleHTTPServer,然後在對應機器上使用wget下載,如果是用VPN連的服務器話,要使用隧道的IP==。

python -m SimpleHTTPServer 9999

unzip

常用1:解壓zip到指定目錄

➜  ~ zip test.zip 3D_spatial_network.txt hello
  adding: 3D_spatial_network.txt (deflated 63%)
  adding: hello (stored 0%)
➜  ~ unzip -d test2 test.zip 
Archive:  test.zip
  inflating: test2/3D_spatial_network.txt  
 extracting: test2/hello             
➜  ~ ls -alh test2
total 20M
drwxrwxr-x  2 storm storm 4.0K Aug 31 15:37 .
drwxr-xr-x 43 storm storm 4.0K Aug 31 15:37 ..
-rw-rw-r--  1 storm storm  20M Aug 29 15:54 3D_spatial_network.txt
-rw-rw-r--  1 storm storm    0 Aug 31 15:19 hello

常用2:列出zip文件中的文件名

unzip -Z -1 archive.zip

-Z:如果zip命令的第一個參數是-Z,則會相當於調用zipinfo命令。

-1:數字1,zipinfo命令的選項,表示只顯示文件名,每個一行,類似ls中的-1。

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