列舉平時常用但不易記住的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。