; N8 r1 t- v$ r {6 a
! Q+ _. |5 G3 d- ^. J前言
: K, E U: S4 o8 g
; c1 S1 g# b; ^! C
3 e6 r* \$ w: s, F7 q& v* G7 b# CLinux常用命令中,有些命令可以用于查看系统的状态,通过了解系统当前的状态,能够帮助我们更好地维护系统或定位问题。本文就简单介绍一下这些命令。, {/ H" d0 R3 b" C0 i# I
查看系统运行时间--uptime3 q" B. o" Z$ q; D4 y
! E& Q1 p' O7 z, B
有时候我们想知道系统上一次复位是在什么时候或者系统已经运行了多长时间,我们可以通过uptime命令获取这些信息:1 `2 d( A% R$ |! I# K/ g
uptime
! y/ l0 k+ ^' `& C/ j, a5 F a20:47:06 up 50 min, 1 user, load average: 0.75, 0.84, 0.93
* n# m/ n" G) s4 N/ J$ m' T从左往右显示的信息依次为:当前时间、已运行时间、用户登录数、1分钟、5分钟和15分钟内系统的平均负载。0 v6 f9 H9 X& y( S
查看系统已登录用户--who& D1 n3 b, w; e
6 o X( r5 K$ J5 y( _who -a, T4 D5 |$ _; N$ W6 v# o' i
hyb tty7 2018-09-30 19:57 (:0)
9 l+ {" t5 t+ V7 }' H* V通过who命令可以查看到哪些用户通过哪个ip登录到了这台主机。
* {; g! Q7 m3 G+ K8 Z8 U2 F" Z5 v查看系统版本相关信息--uname
* Q6 ?- m, @3 _2 Z, R! E: n O* C! ^, |- \
例如:
1 v* J" p: ^- a0 X9 z2 O4 \& xuname -a
; d$ ?5 C# c! \8 ]" ~ MLinux ubuntu16.04 4.15.0-34-generic #37~16.04.1-Ubuntu SMP Tue Aug 28 10:44:06 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux& M- Q: F; X) X' e! L
从结果可以看到操作系统版本(ubuntu16.04),CPU类型(x86_64)等信息7 X( h) Y7 T6 O" u' v- w
查看当前环境变量--export$ ]( O; S4 u# D0 e: b* O
$ | Q7 R; N5 g n/ |
环境变量影响着程序的运行,因此有时候需要查看当前环境的环境变量:+ l6 v- i; G# `2 g& l4 q
export
6 }! U8 @/ F9 A) u) t+ @- Y查看目录和文件占用空间--du J4 C# K/ t/ W5 B/ E
0 D# `; i; Y- [- ]3 t" Ndu命令直接显示当前目录下每个目录及其文件占用空间。结合--max-depth参数可以指定显示的目录层级。
( |5 U- l. `7 e! a: d例如,如果只想显示当前目录下各个目录所占总空间,可以使用:" {! N) T; j. X3 [* l
du -h --max-depth=1
7 A5 t4 x' w& t# Y19M ./python
+ H; h3 j( n2 y+ |/ z) h9.0M ./git
1 a- z# e1 Y# t. z5 q321M ./hexo
! K' d5 ]* I% a) ^" t/ X: ~17M ./lua: F: V$ X& f' l1 h7 v7 `
28K ./vim
/ p9 q) r3 E& ?( x4 [$ o* G; R+ q1.4M ./shell; e) D3 b6 p9 d* ~$ `. ?2 \
81M ./redis" L+ m- w; E7 Q7 u% o! R' N
316M ./books' P1 y+ e: S" L$ N! O
48M ./c
& N5 A! ?2 S3 J810M .
9 ?/ K \6 ] [# D" Fdu -sh #仅统计当前目录总大小+ @0 Z+ Y* N& e4 d, Z
810M8 z$ t1 W& F+ o G a/ N% r& C
其中-h表示以易读的单位显示大小,即M,--max-depth=1表明目录层级。通过命令结果,我们可以看到当前目录下各个子目录占用空间大小,以及总空间大小。$ @2 w) v0 B6 j4 O
查看各挂载点空间--df! R$ r8 y3 x5 n- R2 v+ r; j
/ ~0 s- @& l& o. `例如:, {) l- U, r7 e+ h, p% z
df -h
: ^9 |5 d% \ l4 }5 ~* X; x7 F文件系统 容量 已用 可用 已用% 挂载点+ B5 [+ m% o. [
udev 3.9G 0 3.9G 0% /dev
9 S" M: i2 x5 utmpfs 786M 9.5M 776M 2% /run# K b# s0 r. m: Q* b0 h; s, e
/dev/sda10 24G 9.8G 13G 45% /
4 T/ @: j8 V$ r) f, ~3 B8 Ltmpfs 3.9G 43M 3.8G 2% /dev/shm# ^) F0 J- H6 W j+ \
tmpfs 5.0M 4.0K 5.0M 1% /run/lock0 c8 f: c6 O& V& G' U; u' S
tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup
& B+ b3 d! Y* D/dev/sda11 454M 274M 153M 65% /boot( o: `0 E$ K2 R8 G$ S3 f0 y
/dev/sda15 55G 5.2G 47G 10% /home5 A+ P/ Y f# @) o
/dev/sda1 256M 31M 226M 12% /boot/efi
4 c1 w7 a, E# \' p/dev/sda14 4.6G 9.9M 4.4G 1% /tmp
5 D- q9 r( F; E; b3 Ftmpfs 786M 60K 786M 1% /run/user/1000
8 C4 B9 c; s- ^) }. |1 l: y! B从结果中,我们可以看到各个挂载点总空间以及可用空间。当磁盘文件占用空间较大时,可能导致系统运行缓慢,因此,可根据该结果进行相应的磁盘清理。
& t2 W% J U% H8 l) d- s9 Z查看内存可用情况--free0 a& ]6 k( K0 z$ d% f
$ Y2 H" l1 M: ^! _2 t% }free命令可用于显示系统中可用的物理内存,交换区内存以及内核使用的buffer:# Y8 e. b! r# m$ ?1 @2 p
free -h
; U3 \ M+ b3 d% s8 o- x3 J total used free shared buff/cache available
+ I4 W2 m3 q/ k8 q7 l+ J( @Mem: 7.7G 2.3G 2.6G 268M 2.8G 4.7G
$ R8 r6 H+ J0 `5 OSwap: 7.6G 0B 7.6G) b7 b9 G$ n5 b3 K( ?
从执行结果可以看到已用内存和空闲内存的情况。同样地,当内存不足时,可能导致程序运行异常或系统卡顿。! U) {, y5 t' b8 T. p3 `- J
查看进程的内存使用情况--pmap
+ b- S |; @ }6 Q5 f& A+ [' k) ]6 y* I" X! L
pmap命令用于查看进程内存相关信息:' M* @- t) n3 T) Y) b8 W" `% X
pmap pid #pid为进程id,可通过ps命令获取
2 _7 j4 O* W% W- S6030: ./main
. D/ k& b/ t. M2 ^# [; J7 E9 q0000000000400000 4K r-x-- main
. _: O8 T/ S% s! k, y0 ]; J% D0000000000600000 4K r---- main
! B! E7 y) Y8 w) W8 a+ H0000000000601000 4K rw--- main, z. o6 N4 ]$ R6 D* \
00000000017d2000 132K rw--- [ anon ]
' B1 @+ p1 M" n$ H00007fc3843e8000 1792K r-x-- libc-2.23.so
! ~5 b6 D2 {- H00007fc3845a8000 2048K ----- libc-2.23.so
+ q" W+ T. l- W% k00007fc3847a8000 16K r---- libc-2.23.so- l+ t4 d. e/ t* n
00007fc3847ac000 8K rw--- libc-2.23.so
8 i: c% w, v9 C9 n; Q4 t2 C! M00007fc3847ae000 16K rw--- [ anon ] u: b/ v q% n {5 @# |) u) P
00007fc3847b2000 152K r-x-- ld-2.23.so2 e$ b7 Z% s* p; j# I
00007fc3849b9000 12K rw--- [ anon ]
+ u5 }" h# Q u9 v3 Q9 R1 x8 W7 S00007fc3849d7000 4K r---- ld-2.23.so* U0 _7 r/ }! S0 k5 C. E2 y2 o
00007fc3849d8000 4K rw--- ld-2.23.so
9 T. t. X5 w2 U/ f: {1 X00007fc3849d9000 4K rw--- [ anon ]
: B. V2 i j0 W0 i& s, d00007ffcf2018000 132K rw--- [ stack ]/ ]3 ~$ H7 s: n B
00007ffcf2175000 12K r---- [ anon ]
4 B# G. u3 b Q, y- g" ^. c) C, p00007ffcf2178000 8K r-x-- [ anon ]) x' `5 P, q, w3 p
ffffffffff600000 4K r-x-- [ anon ]2 p6 K5 w# Y& m/ v: W7 i+ w
total 4356K
5 _0 J/ f; O' ]/ U7 |: _我们可以根据进程各部分占用空间情况,来不断优化我们的程序。
: i% d; U, r" h, `查看虚拟内存统计信息--vmstat
5 k ]% t5 r8 T0 a
4 e0 @9 n- `) L, Pvmstat$ H) ^* a. G2 ~" Z) Z9 V0 f: |6 `
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----+ j: Q; A# f0 J. J2 D+ |7 J" ?
r b swpd free buff cache si so bi bo in cs us sy id wa st
, W2 g" L$ L$ H3 ]! {" e8 l 1 0 0 2214960 407828 2572148 0 0 126 57 377 1006 8 2 88 2 08 F8 B; L1 b; s
vmstat的输出值能够帮助我们了解当前系统的性能。比如说,如果si(每秒从交换区写到内存的大小)和so(每秒写入交换区的内存大小)的值经常大于0,说明内存可能不够用,因此才需要用到交换空间。再比如说,us(用户进程执行时间百分比)的值比较高时,说明用户进程消耗的CPU资源较多。而wa(IO等待时间百分比)值较高时,说明IO等待情况严重。
/ u' H; o A" G/ e- `4 r0 K查看ip地址--ip
3 t' k. a% i" v6 x
% p9 h7 Z2 z3 q有时候使用ifconfig命令并不一定能够看到所有的ip地址,因此可以使用:0 e6 Q5 Y2 d6 C0 [4 O
ip addr
P; z* N5 y+ {. ?) r3 {( z/ Y查看网络连接状态--netstat7 \9 u' l* q! V
0 n" h) x' a; Q- K7 Unetstat命令可以查看网络连接状态,通常用于诊断网络相关问题。例如查看端口是否被占用,连接是否已经释放,服务是否在监听等等。
W% e8 C4 Z7 e8 \# k; K查看进程间关系--pstree8 e6 x7 I) |2 n# N* L& v, b% r
4 m3 M- P3 j/ H1 w8 W5 g5 H& n" L
通过pstree命令可以看到进程间的父子关系,它以树形结构显示这些信息:3 @# k; w& \3 c8 g2 F |# \7 L' l
pstree
3 x' w6 I2 n1 y+ o6 i/ a# ysystemd─┬─ModemManager─┬─{gdbus}. ? W# g' F2 k8 X9 D! h* J
│ └─{gmain}: T( j, ]- A$ F- A- ^: L
├─NetworkManager─┬─dhclient, F: ]" w1 _! s0 z, g5 |1 S \
│ ├─dnsmasq; ?5 {+ [9 Q5 T$ o8 |" F
│ ├─{gdbus}
* U7 I# q0 p1 S9 G │ └─{gmain}$ o# h6 _8 E& @' C. K3 C
├─accounts-daemon─┬─{gdbus}# c; i1 I5 ~& [) H
│ └─{gmain}
# D6 N: ?( s Y1 ^ T5 g ├─acpid l: w0 m& a+ J0 g' ?3 I, A
├─atd
9 g! {7 a. {3 W! O ├─avahi-daemon───avahi-daemon7 u% K6 {/ f ?. z7 U
├─bluetoothd2 f1 u0 p; i3 L1 }4 H
├─colord─┬─{gdbus}, z2 I8 q- R/ g; B3 e8 h5 Z# l% `6 b
│ └─{gmain}: K1 n: }% H- ?0 L) F+ v8 J
├─cron
: ]; H: U0 d( I3 G ├─cups-browsed─┬─{gdbus}1 N. Z4 i6 V3 ?/ p
│ └─{gmain}
0 ?' b# A. k+ v ├─cupsd───3*[dbus]% l. t3 a8 d- V3 `, S
├─dbus-daemon
( ?) _: m( d' M# F& ?9 I1 J& x ├─gnome-keyring-d─┬─{gdbus}
3 z% }2 p* N+ w; g │ ├─{gmain}
: ~; A' R9 A# C% B) | │ └─{timer}
7 P& F J# }3 }' y: \% @. A1 {(仅显示部分内容)! ^, `" r, r* u+ Z
总结
, O! L3 m! v) j p$ }* v5 Y$ T9 ]0 {7 O/ E1 E/ H4 t
实际上,前面所提到的很多相关命令信息都是从系统文件中获取的,例如/proc/meminfo保存了内存相关信息,/proc/net/dev保存网络流量相关信息。只是,它们都是静态数值,但是我们可以结合watch命令来动态地观察这些信息,例如: O# s5 p6 }6 J0 @+ I
watch -n 1 cat /proc/meminfo
+ k6 C, N- @. x; T# G+ ?
, a& ~0 Q. M% D' q; Vwatch -n 1 cat /proc/net/dev
) o, V0 D8 w& c' x2 r( A2 e: n! d上面的命令表示,每隔一秒执行一次cat /proc/meminfo或cat /proc/net/dev,因此我们可以看到内存信息或网卡流量信息在实时刷新。
' C, e1 z( v* O, a本文仅介绍这些命令的经典使用,更多使用可通过man 命令查看。通过前面这些系统自带命令,我们可以比较方便地监控系统状态,从而帮助我们维护系统或定位问题。欢迎留言补充或更正。
|