大家都知道,Linux系统提供了非常多非常多的命令或工具,这些命令都各有所长,都是系统需要的。但我们精力有限,要掌握全部的命令不太现实,所以只需要掌握其中部分常用的命令即可。这里,我就从一个Java程序员的角度,总结出我常用的一些Linxu命令,供大家参考。
图1
图2
图3
echo "checking pid($pid)"
fi
if test -z "$(jps -l | cut -d '' -f 1 | grep $pid)"
then
echo "process of $pid is not exists"
exit
fi
lineNum=$2
if test -z $lineNum
常用选项:
find 在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名。如果使用该命令时,不设置任何参数,则find命令将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示。 示例:
示例:
[sre@CDVM-213017031 ~]$ which java
/usr/java/default/bin/java
[sre@CDVM-213017031 ~]$ which pwd
/bin/pwd
[sre@CDVM-213017031 ~]$ which python
/usr/bin/python
常用选项:
kill -9 强制终止进程
kill -15 正常终止进程
具有相似功能的命令,还有killall、pkill等。
watch 以周期性的方式执行给定的指令,指令输出以全屏方式显示。 常用选项:
watch ss
Every 2.0s: ssMon May 8 16:23:58 2017
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 0 ::ffff:10.213.17.31:45473 ::ffff:10.213.18.49:10994
ESTAB 0 0 ::ffff:10.213.17.31:30046 ::ffff:10.209.19.143:10117
ESTAB 0 0 ::ffff:10.213.17.31:11233 ::ffff:10.209.26.154:10118
ESTAB 0 0 ::ffff:10.213.17.31:55524 ::ffff:10.209.33.69:eforward
ESTAB 0 0 ::ffff:10.213.17.31:56865 ::ffff:10.209.18.34:10218
ESTAB 0 0 ::ffff:10.213.17.31:25608 ::ffff:10.209.19.144:10117
ESTAB 0 0 ::ffff:10.213.17.31:19649 ::ffff:10.209.18.64:10620
[sre@CDVM-213017031 ~]$ nslookup www.baidu.com
Server: 10.209.11.13
Address: 10.209.11.13#53
Non-authoritative answer:
www.baidu.com canonical name = www.a.shifen.com.
Name: www.a.shifen.com
Address: 111.206.223.205
Name: www.a.shifen.com
Address: 111.206.223.206
示例:
[sre@CDVM-213017031 ~]$ ifconfig
eth0 Link encap:Ethernet HWaddr FA:16:3E:7E:55:D1
inet addr:10.213.17.31 Bcast:10.213.23.255 Mask:255.255.248.0
inet6 addr: fe80::f816:3eff:fe7e:55d1/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:31875618113 errors:0 dropped:0 overruns:0 frame:0
TX packets:28230970908 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:13949365053248 (12.6 TiB) TX bytes:5198483437608 (4.7 TiB)
ifconfig eth0 down 关闭网卡eth0
ifconfig eht0 up 启动网卡eth0
常用选项:
-d:屏幕刷新间隔时间
-u<用户名>:指定用户名
-p<进程号>:指定进程
-n<次数>:循环显示的次数
交互命令:
1:显示全部CPU信息
k:终止一个进程
i:忽略闲置和僵死进程,这是一个开关式命令
q:退出程序
o或者O:改变显示项目的顺序
m:切换显示内存信息
t:切换显示进程和CPU状态信息
c:切换显示命令名称和完整命令行
M:根据驻留内存大小进行排序
P:根据CPU使用百分比大小进行排序
T:根据时间/累计时间进行排序
示例:
top -p 25211
top - 17:14:06 up 559 days, 4:54, 2 users, load average: 0.06, 0.01, 0.00
Tasks: 1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie
Cpu0 : 0.0%us, 0.3%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu1 : 0.3%us, 0.3%sy, 0.0%ni, 99.3%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu2 : 0.3%us, 0.3%sy, 0.0%ni, 99.3%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu3 : 6.8%us, 3.4%sy, 0.0%ni, 89.8%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 4054588k total, 3916560k used, 138028k free, 114260k buffers
Swap: 0k total, 0k used, 0k free, 730196k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
25211 sre 20 0 4624m 1.9g 9m S 12.7 49.7 6014:18 java
上面是执行 top -p 25211后,单击“1”后的效果。
free 显示当前系统未使用的和已使用的内存数目,还可以显示被内核使用的内存缓冲区。 常用选项:
-b:以Byte为单位显示内存使用情况
-k:以KB为单位显示内存使用情况
-m:以MB为单位显示内存使用情况
-t:显示内存总和列
示例:
[sre@CDVM-213017031 ~]$ free -m
total used free shared buffers cached
Mem: 3959 3825 134 0 111 713
-/+ buffers/cache: 3000 959
Swap: 0 0 0
sar Linux下系统运行状态统计工具,它将指定的操作系统状态计数器显示到标准输出设备。sar工具将对系统当前的状态进行取样,然后通过计算数据和比例来表达系统的当前运行状态。它的特点是可以连续对系统取样,获得大量的取样数据。取样数据和分析的结果都可以存入文件,使用它时消耗的系统资源很小。我常用它查看网卡流量,具体请参考 Linux查看实时网卡流量的几种方式。
lsof lsof命令用于查看你进程开打的文件,打开文件的进程,进程打开的端口(TCP、UDP)。 常用选项:
-a:列出打开文件存在的进程
-c<进程名>:列出指定进程所打开的文件
-p<进程号>:列出指定进程号所打开的文件
示例:
[sre@CDVM-213017031 ~]$ lsof | wc -l
1278
[sre@CDVM-213017031 ~]$ lsof | grep 10117 | wc -l
9
[sre@CDVM-213017031 ~]$ lsof | grep 10117
java 402 sre 143u IPv6 1879294557 0t0 TCP CDVM-213017031:63449->10.209.19.143:10117 (ESTABLISHED)
java 402 sre 144u IPv6 1879294563 0t0 TCP CDVM-213017031:63450->10.209.19.143:10117 (ESTABLISHED)
java 402 sre 145u IPv6 1879294564 0t0 TCP CDVM-213017031:25608->10.209.19.144:10117 (ESTABLISHED)
java 11538 sre 43u IPv6 720753145 0t0 TCP CDVM-213017031:30045->10.209.19.143:10117 (ESTABLISHED)
java 11538 sre 44u IPv6 720753147 0t0 TCP CDVM-213017031:30046->10.209.19.143:10117 (ESTABLISHED)
java 11538 sre 45u IPv6 720762177 0t0 TCP CDVM-213017031:47599->10.209.19.144:10117 (ESTABLISHED)
java 25211 sre 267u IPv6 1855869958 0t0 TCP CDVM-213017031:54013->10.209.19.143:10117 (ESTABLISHED)
java 25211 sre 271u IPv6 1855869959 0t0 TCP CDVM-213017031:16169->10.209.19.144:10117 (ESTABLISHED)
java 25211 sre 294u IPv6 1855870096 0t0 TCP CDVM-213017031:54030->10.209.19.143:10117 (ESTABLISHED)
当程序报too many open files 异常时,可以使用它查看是什么进程打开了太多的文件,主要查看是不是文件(包括网络链接)打开后是不是没有关闭,我之前的一个项目,就遇到了这种问题。
ulimit 用来限制系统用户对shell资源的访问。支持以下各种类型的限制:所创建的内核文件的大小、进程数据块的大小、Shell 进程创建文件的大小、内存锁住的大小、常驻内存集的大小、打开文件描述符的数量、分配堆栈的最大大小、CPU 时间、单个用户的最大线程数、Shell 进程所能使用的最大虚拟内存。同时,它支持硬资源和软资源的限制。 常用选项:
-a:显示目前资源限制的设定
-n <文件数目>:指定同一时间最多可开启的文件数
-u <程序数目>:用户最多可开启的程序数目
示例:
[sre@CDVM-213017031 ~]$ ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 31517
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 409600
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 65535
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
vmstat 显示虚拟内存状态(“Viryual Memor Statics”),但是它可以报告关于进程、内存、I/O等系统整体运行状态。 常用选项:
-a:显示活动内页
-f:显示启动后创建的进程总数
-m:显示slab信息
-n:头信息仅显示一次
-s:以表格方式显示事件计数器和内存状态
-d:报告磁盘状态
-p:显示指定的硬盘分区状态
-S:输出信息的单位。
示例:
[sre@CDVM-213017031 ~]$ vmstat 2
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 126316 114292 736992 0 0 1 4 0 0 1 1 98 0 0
1 0 0 126432 114292 736992 0 0 0 0 2289 4432 2 1 97 0 0
0 0 0 126480 114292 736992 0 0 0 0 2572 5132 2 1 97 0 0
[sre@CDVM-213017031 ~]$ iostat -x 1 2
Linux 2.6.32-431.el6.x86_64 (CDVM-213017031) 05/08/2017 _x86_64_ (4 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.94 0.00 0.53 0.10 0.02 98.41
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
vda 0.01 2.69 0.11 1.30 9.02 32.13 29.09 0.05 34.90 5.07 0.72
avg-cpu: %user %nice %system %iowait %steal %idle
2.77 0.00 2.27 0.00 0.25 94.71
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
vda 0.00 1.00 0.00 3.00 0.00 32.00 10.67 0.01 4.00 1.33 0.40
[sre@CDVM-213017031 ~]$ jmap -heap 25211
Attaching to process ID 25211, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 24.65-b04
using parallel threads in the new generation.
using thread-local object allocation.
Concurrent Mark-Sweep GC
Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize = 2147483648 (2048.0MB)
NewSize = 348913664 (332.75MB)
MaxNewSize = 348913664 (332.75MB)
OldSize = 697892864 (665.5625MB)
NewRatio = 2
SurvivorRatio = 8
...
示例2,查看包com.wanda中的类创建的对象占用内存信息:
[sre@CDVM-213017031 ~]$ jmap -histo 25211 | grep "com.wanda" | head -5
num #instances #bytes class name
----------------------------------------------
46: 4167 500040 com.wanda.arch.owl.domain.monitorelement.MIndicator
63: 8192 327680 com.wanda.fix.org.jboss.netty.util.internal.ConcurrentIdentityHashMap$Segment
73: 8192 262192 [Lcom.wanda.fix.org.jboss.netty.util.internal.ConcurrentIdentityHashMap$HashEntry;
102: 1428 148512 com.wanda.arch.owl.domain.monitorelement.LComponent
138: 2048 98304 com.wanda.fix.org.jboss.netty.util.internal.ConcurrentIdentityHashMap
[sre@CDVM-213017031 ~]$ jstat -gcutil 25211 5000 2
S0 S1 E O P YGC YGCT FGC FGCT GCT
0.00 4.82 82.82 58.15 60.00 197263 2435.605 72 1.186 2436.791
5.36 0.00 28.22 58.16 60.00 197264 2435.620 72 1.186 2436.806
说明:
S0 Heap上的 Survivor space 0 区已使用空间的百分比
S1 Heap上的 Survivor space 1 区已使用空间的百分比
E Heap上的 Eden space 区已使用空间的百分比
O Heap上的 Old space 区已使用空间的百分比
P Perm space 区已使用空间的百分比
YGC 从应用程序启动到采样时发生 Young GC 的次数
YGCT 从应用程序启动到采样时 Young GC 所用的时间(单位秒)
FGC 从应用程序启动到采样时发生 Full GC 的次数
FGCT 从应用程序启动到采样时 Full GC 所用的时间(单位秒)
GCT 从应用程序启动到采样时用于垃圾回收的总时间(单位秒),它的值等于YGC+FGC
jstack 25211 > 25211.txt 将当前堆栈信息输出到文件。
以上就是我常用的Linux命令,可能有一些常用的一时没有想到,等到想到时再补充进来吧。 另外,文中 Java常用工具 中提到的几个命令,尤其重要,尤其常用,特别是当你的程序上线以后,它能方便而快速的帮你定位问题,解决问题。
原文地址:http://www.jianshu.com/p/341bc031ea2b 作者:刘振锋