开发者头条IT·实战·经验互联网技术栈

Java程序员最常用的Linux命令

2017-05-08  本文已影响3787人  刘振锋

大家都知道,Linux系统提供了非常多非常多的命令或工具,这些命令都各有所长,都是系统需要的。但我们精力有限,要掌握全部的命令不太现实,所以只需要掌握其中部分常用的命令即可。这里,我就从一个Java程序员的角度,总结出我常用的一些Linxu命令,供大家参考。

文件目录基本操作

ls(选项)(参数)
-a 显示所有档案及目录(ls默认不会列出隐藏文件);
-l 所有输出信息用单列格式输出,不输出为多列;
--color[=WHEN]:使用不同的颜色高亮显示不同类型的。

实际应用时,我经常会使用ls -l --color=auto,并给它指定一个别名ll:

alias ll='ls -l --color=auto'

效果如图1:


图1
cd   进入用户主目录
cd ~ 进入用户主目录
cd - 返回进入此目录之前所在的目录
cd .. 返回上级目录(若当前目录为“/“,则执行完后还在“/";".."为上级目录的意思)
cd ../.. 返回上两级目录
cd !$ 把上个命令的参数作为cd参数使用
-p 若所要建立目录的上层目录目前尚未建立,则会一并建立上层目录
-f:强制删除文件或目录
 -i:删除已有文件或目录之前先询问用户
-r或-R:递归处理,将指定目录下的所有文件与子目录一并处理

注意:使用rm命令要格外小心。因为一旦删除了一个文件,就无法再恢复它。

-f:强行复制文件或目录,不论目标文件或目录是否已存在
-i:覆盖既有文件之前先询问用户
-R/r:递归处理,将指定目录下的所有文件与子目录一并处理

示例:

cp /home/sre/tom.log .   将文件/home/sre/tom.log复制到当前目录
cp -r katarina  /home/sre/logs/ 将目录katarina复制到/home/sre/logs/目录下
-f:若目标文件或目录与现有的文件或目录重复,则直接覆盖现有的文件或目录
-u:当源文件比目标文件新或者目标文件不存在时,才执行移动操作

示例:

mv katarina/* logs/ 将目录katarina下所有文件复制到目录logs下
touch /var/wd/logs/touch.txt 创建空文件/var/wd/logs/touch.txt
chmod +x what_cpu_do.sh 给脚本what_cpu_do.sh增加可执行权限
chmod u+x,g+w test  //为文件test设置自己可以执行,组员可以写入的权限
[sre@CDVM-213017031 ~]$ file what_cpu_do.sh
what_cpu_do.sh: Bourne-Again shell script text executable
[sre@CDVM-213017031 ~]$ file logs
logs: directory
[sre@CDVM-213017031 ~]$ file network_last.log
network_last.log: empty
[sre@CDVM-213017031 ~]$ file fix
fix: directory

文件内容查看

[sre@CDVM-213017031 ~]$ cat flow_of_network.sh | grep "RX_next"
  RX_next=$(cat /proc/net/dev | grep $ethn | sed 's/:/ /g' | awk '{print $2}')
  RX=$((${RX_next}-${RX_pre}))
-A<显示列数> (After)除了显示符合范本样式的那一行之外,并显示该行之后的内容
 -B (Before)在显示符合范本样式的那一行之外,并显示该行之前的内容
-C<显示列数> 除了显示符合范本样式的那一列之外,并显示该列之前后的内容
-i 忽略字符大小写。

示例:

[sre@CDVM-213017031 ~]$ cat what_cpu_do.sh | grep "process of" -A 5 -B 5 (等效于 cat what_cpu_do.sh | grep "jstack" -C 5 )
 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
-f:显示文件最新追加的内容(查看服务器上动态刷新的日志时经常使用)。
-n:输出文件的尾部N(N位数字)行内容

示例:

tail -100f /var/wd/logs/owl/owl.20170508.log 显示文件/var/wd/logs/owl/owl.20170508.log中的后100行,并且当文件有更新显示最新的内容。
-n<数字>:指定显示头部内容的行数
-c<字符数>:指定显示头部内容的字符数
-v:总是显示文件名的头信息
-q:不显示文件名的头信息
Space键:显示文本的下一屏内容
Enter键:只显示文本的下一行内容
斜线符/:接着输入一个模式,可以在文本中寻找下一个相匹配的模式
h键:显示帮助屏,该屏上有相关的帮助信息
b键:显示上一屏内容
q键:退出rnore命令
-c:只显示Bytes数
-l:只显示列数
-w:只显示字数
-c:取代所有不属于第一字符集的字符
-d:删除所有属于第一字符集的字符
-s:把连续重复的字符以单独一个字符表示

示例:

echo "HELLO WORLD" | tr 'A-Z' 'a-z' hello world  将输入字符由大写转换为小写
hello world
echo "hello 123 world 456" | tr -d '0-9' hello world 使用tr删除字符
hello world
-d:排序时,处理英文字母、数字及空格字符外,忽略其他的字符
-f:排序时,将小写字母视为大写字母
-k:  来指定列数
-r:以相反的顺序来排序来自

示例:

[sre@CDVM-213017031 ~]$ ps -mp 25211 -o THREAD,tid,time | sort -r -k 2
USER     %CPU PRI SCNT WCHAN  USER SYSTEM   TID     TIME
sre       8.8   -    - -         -      -     - 4-04:00:56
sre       5.4  19    - futex_    -      - 25485 2-13:59:26
sre       0.8  19    - futex_    -      - 16755 00:00:24
sre       0.1  19    - ep_pol    -      - 25663 01:31:00
sre       0.1  19    - ep_pol    -      - 25487 01:38:57
sre       0.1  19    - ep_pol    -      - 25486 01:38:52
sre       0.0  19    - skb_re    -      - 24586 00:00:00
sre       0.0  19    - poll_s    -      - 25678 00:44:56
sre       0.0  19    - poll_s    -      - 25676 00:00:00
sre       0.0  19    - poll_s    -      - 25213 00:00:01
sre       0.0  19    - futex_    -      -  7679 00:00:00
sre       0.0  19    - futex_    -      -  5952 00:00:00

上述命令功能:查看进程(pid为25211)占用CPU资源最多的线程信息(根据CPU占用率倒序排列)。

文件查找与比较

find /home -name "*.txt"  在/home目录下查找以.txt结尾的文件名
find /home -iname "*.txt" 同上,但忽略大小写
find /home ! -name "*.txt"  找出/home下不是以.txt结尾的文件
[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
[sre@CDVM-213017031 ~]$ whereis python
python: /usr/bin/python /usr/bin/python2.6 /usr/lib/python2.6 /usr/lib64/python2.6 /usr/include/python2.6 /usr/share/man/man1/python.1.gz
[sre@CDVM-213017031 ~]$ whereis lua
lua: /usr/bin/lua /usr/lib64/lua /usr/share/lua /usr/share/man/man1/lua.1.gz
[sre@CDVM-213017031 ~]$ whereis java
java: /usr/bin/java
locate /etc/sh  搜索etc目录下所有以sh开头的文件
locate -i ~/m 搜索用户主目录下,所有以m开头的文件,并且忽略大小写

文件压缩与解压

-c:建立新的备份文件
-z:通过gzip指令处理备份文件
-v:显示指令执行过程
-f:指定备份文件
-x:从备份文件中还原文件

示例:

tar -cvf log.tar log2012.log 仅打包,不压缩!
tar -zcvf log.tar.gz log2012.log 打包后,以 gzip 压缩 
tar -jcvf log.tar.bz2 log2012.log 打包后,以 bzip2 压缩

进程管理

[sre@CDVM-213017031 ~]$ ps aux | grep "sudo"
sre       9524  0.0  0.0 103252   832 pts/1    S+   16:16   0:00 grep sudo
root     19503  0.0  0.0 189992  2996 pts/1    S    13:37   0:00 sudo su - sre
root     22710  0.0  0.0 189992  3000 pts/0    S    11:42   0:00 sudo su - sre

以及上文提到的:

ps -mp 25211 -o THREAD,tid,time | sort -r -k 2
kill -9 强制终止进程
kill -15 正常终止进程

具有相似功能的命令,还有killall、pkill等。

-n:指定指令执行的间隔时间(秒)
-d:高亮显示指令输出信息不同之处
-t:不显示标题。

示例:

watch ss
Every 2.0s: ss                                                                                                                                               Mon 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
service mysqld status 
mysqld (pid 1638) 正在运行... 
service mysqld restart 
停止 MySQL: [ 确定 ] 
启动 MySQL: [ 确定 ]

网络操作

wget http://www.yourserverip.net/testfile.zip 下载文件
[sre@CDVM-213017031 ~]$ ping www.wanda.cn
PING www.wanda.cn (10.199.8.10) 56(84) bytes of data.
64 bytes from 10.199.8.10: icmp_seq=1 ttl=244 time=50.8 ms
64 bytes from 10.199.8.10: icmp_seq=2 ttl=244 time=51.8 ms
64 bytes from 10.199.8.10: icmp_seq=3 ttl=244 time=51.0 ms
64 bytes from 10.199.8.10: icmp_seq=4 ttl=244 time=53.3 ms
[sre@CDVM-213017031 ~]$ telnet 10.213.17.32 10000
Trying 10.213.17.32...
telnet: connect to address 10.213.17.32: Connection refused
[sre@CDVM-213017031 ~]$ telnet 10.213.17.32 10062
Trying 10.213.17.32...
Connected to 10.213.17.32.
Escape character is '^]'.
^C
Connection closed by foreign host.
[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
-n:不解析服务名称,以数字方式显示
-a:显示所有的套接字
 -l:显示处于监听状态的套接字
-m:显示套接字的内存使用情况
-p:显示使用套接字的进程信息
-i:显示内部的TCP信息;
-t:只显示tcp套接字
-u:只显示udp套接字

示例:

[sre@CDVM-213017031 ~]$ ss -t
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:14073                                                    ::ffff:10.209.18.33:10620
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:20347                                                    ::ffff:10.209.18.64:10620
ESTAB       0      0                                                       ::ffff:10.213.17.31:41799                                                    ::ffff:10.209.18.34:10620
ESTAB       0      0                                                       ::ffff:10.213.17.31:39386                                                    ::ffff:10.209.33.70:10434
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
[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

系统管理

-a 显示目录中个别文件的大小
-b 显示目录或文件大小时,以byte为单位
 -c 除了显示个别目录或文件的大小外,同时也显示所有目录或文件的总和
-k 以KB(1024bytes)为单位输出
-m 以MB为单位输出
-s 仅显示总计,只列出最后加总的值
-h 以K,M,G为单位,提高信息的可读性

示例:

[sre@CDVM-213017031 ~]$ du -h *
4.0K    a.sh
1.7G    catalina.out
317M    collect_sample
632K    fix/plugin
372K    fix/boot
8.0K    fix/script
41G fix/log
6.1M    fix/lib

性能监测与优化

 -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”后的效果。

-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
-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 异常时,可以使用它查看是什么进程打开了太多的文件,主要查看是不是文件(包括网络链接)打开后是不是没有关闭,我之前的一个项目,就遇到了这种问题。

-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
-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
-c:仅显示CPU使用情况
-d:仅显示设备利用率
 -k:显示状态以千字节每秒为单位,而不使用块每秒
-m:显示状态以兆字节每秒为单位
-x:显示扩展状态

示例:

[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

Java常用工具

java -jar test.jar
-l:输出完全的包名,应用主类名,jar的完全路径名 
-v:输出jvm参数 

示例:

[sre@CDVM-213017031 ~]$ jps -l
402 org.apache.flume.node.Application
13466 sun.tools.jps.Jps
11538 com.wanda.monitor.server.MonitorStartup
25211 org.apache.catalina.startup.Bootstrap
-dump:[live,]format=b,file=<filename> 使用hprof二进制形式,输出jvm的heap内容到文件=. live子选项是可选的,假如指定live选项,那么只输出活的对象到文件. 
-heap 打印heap的概要信息,GC使用的算法,heap的配置及wise heap的使用情况.
-histo[:live] 打印每个class的实例数目,内存占用,类全名信息. VM的内部类名字开头会加上前缀”*”. 如果live子参数加上后,只统计活的对象数量. 

示例1,查看进程内存信息:

[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
-gcutil 用于查看新生代、老生代及持代垃圾收集的情况
-class 用于查看类加载情况的统计

示例:

[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常用工具 中提到的几个命令,尤其重要,尤其常用,特别是当你的程序上线以后,它能方便而快速的帮你定位问题,解决问题。

相关阅读:


本文首发在 刘振锋的简书博客 原文地址为《Java程序员最常用的Linux命令》转载请注明!

上一篇 下一篇

猜你喜欢

热点阅读