最近学习linux命令的一个总结

最近学习了unix power tools,一方面是想增加对unix系统的了解;另一方面也是想增进使用效率,因为unix一大特色就是内置工具的丰富性。有了这些工具,可以方便的查看系统信息,查找需要的文件,编辑文本等等。

分别从以下几个出发点开始,找寻解决方案:

一,当程序或者系统出现问题的时候,如何帮助发现问题? 也就是如何查看进程和系统的状态?

参考自 http://mp.weixin.qq.com/s?__biz=MjM5NTU2MTQwNA==&mid=2650652942&idx=1&sn=8634ca5782d051a1c43f9708ed9dad61&chksm=beffcbdd898842cbd60d8b435666569e540c58987d5a5855ff3ed3736a873ce79085f4b1f91a&scene=0#wechat_redirect

对于系统和进程而言,比较常用的命令有ps,top,netstat,vmstat,lsof,ifconfig等。

1.找出进程ID

ps -u userABC | grep proccessName | sed -n 1p | awk '{print $1}'

找到用户userABC,且进程名为proccessName 的进程ID号。

2.查看进程cpu使用率

ps -p pID -o pcpu | grep -v CPU

可以获得实时cpu使用率。

3.查看进程内存使用情况

ps -p pID -o vsz | grep -v VSZ  这条命令显示虚拟内存使用量,单位kb
ps -p pID -o rss | grep -v RSS 这条命令显示物理内存使用量,单位kb

4.检测进程使用的文件句柄数量

ls /proc/25082/fd | wc -l

补充一下:/proc文件夹包含正在运行的进程的所有信息,ps、top、vmstat等命令都是以这个文件夹内的数据为基础进行展示。/proc目录是一个伪目录,它只存在于内存当中,而不在外部存储空间,用户可以通过这个目录获取进程信息,也可以改变内核的某些参数。

在/proc目录下,每一个以数字命名的目录都代表对应进程号的进程信息,如/2580目录下的内容反映了进程号为2580的进程的信息。在/2580目录下,可以看到代表各类数据的文件,如io,cmdline,mem等。

5.端口检测

netstat -an | grep tcp | grep ":80" | awk '{print $1,$6}'  检测80端口在对tcp的监听状态

netstat -an | grep tcp | grep ESTABLISHED  查看已经建立的tcp链接

6.系统cpu负载

vmstat 1 5 | sed -n '3,$p' | awk '{print $15}'

vmstat每隔1秒,总共去五次负载信息,sed从第三行数据行开始读取,awk输出每一行的第15列,默认以空格作为分隔符

7.系统磁盘空间

http://www.cnblogs.com/starRebel/p/5897450.html

df -k /dev   查看/dev目录的磁盘空间使用情况

du -sh ~  查看home目录的磁盘使用

8.查看网络流量

ifconfig eth0 | grep bytes | awk '{print $2}' | awk -F : '{print $2}'

查看eth0网卡的总输入流量,外面增加一层循环可以得到一个时间段内的输入流量

或者使用sar命令查看,sar是一个很强大的功能,如果想要在系统信息统计方面进行深入研究,可以认真学习下man sar。

如sar -n SOCK, sar -v 1 5等。

如果查看单独某一个进程的网络流量要稍微复杂一些,nethogs是个不错的工具

9.查看系统内存使用率

top | grep "^Mem"

10.查看系统磁盘读写速率

iostat -d -k 2

也可以通过dstat -d 查看实时数据,然后再汇总。

ps:dstat是个功能强大的工具,可以说是多种常用查询工具的汇总,有:

dstat -c;  dstat -n; dstat -m 等等等等。

二,网络出现故障了,如何检查出错位置?

由最基础的网卡到网络中的路由,一步一步检测:

1. 检测网卡,一般来说ifconfig eth0应该就可以了,如果显示的信息正确,则说明网卡没问题。也可以ping自身:ping 127.0.0.1

2. 检测网关:先使用route -n 查看网关地址,再用ping 网关ip 检测。

3. 检查DNS服务:使用 dig 或者nslookup baidu.com可以查看DNS服务器是否正常。

4. 查看路由:使用traceroute baidu.com命令可以看到到达沿途每个路由器的时间及延时。

5. 查看端口,有的时候ping命令的端口会被静止,这时可以使用 telnet ip port 来测试对方端口是否开启。

6. 端口检测,如上一.5。

7. 最后,使用iptables命令查看本地防火墙策略。

三,unix目录结构及一般性用途

/proc -- 存储运行时内核数据

/etc -- 存放所有系统管理所需的配置文件

/etc/init.d/ 文件夹下存放着许多对系统服务进行控制的脚本,有时候你希望能在不使用kill 或killall 命令的情况下,能干净的启动或杀死一个进程,就可以使用init.d下的控制脚本stop服务。

/etc/rc#.d/ 不同的#(数字,如rc0.d)代表不同的启动级别,目录下的每个脚本其实都软连接指向init.d下的脚本。

  /etc/hosts  --  本地域名解析文件

/var和/opt等目录可以参考http://www.jb51.net/LINUXjishu/151820.html

四,如何快速的查找文件,或者快速查找包含制定内容的文件?

另一个比较大的需求是如何在目录中找到想要的文件或目录。

首先是grep命令:返回匹配正则表达式的行。

grep -i "findone"  aaa.java   bbb.perl

grep -r -i "getday"  递归搜索

使用find命令是个不错的选择:

find ./java/src/ -type f | xargs cat | grep -v "^ *$" | wc -l 统计指定目录下所有文件的行数(不包括空行)

find ./SignalSystem/perl/WebUI/ -type f -name "U*"  查找目标目录下名字是U开头的文件类型的文件。

find还有许多选项,如-user, -group, -size, -mtime等。

find . -perm -20 | xargs chmod g-w

find . -atime +5 ( -name "*.o" -o -name "*.tmp")

比较常用的是带执行的格式:

find . -name "*.cc" -exec grep -n "fdsa" {} \;  "{}"表示find找到的文件, "\;"表示exec命令的结束地方,转义形式。

更多功能可以参考unix power tools。

五,如何高效率进行文本分析,而不是需要每次都写脚本程序?

unix命令行的一大功能是可以高效的进行文本分析:

ls ~/ | wc -l  统计home目录下的文件数(目录也算文件的一种)

sed是一个文本处理工具,一行为单位,可以进行替换、删除、新增等操作。awk是一个文本分析工具。grep、sed和awk往往结合起来使用。

vmstat 1 5 | sed -n '3,$p'  从第三行输出前一个命令的结果

echo "cdsa 312 3321 fdsa 11112% fdsa " | sed 's/.*\([0-9]\{4,10\}%\).*/\1/g'  sed进行替换(正则表达式),输出11112%。

ifconfig eth0 | grep bytes | awk '{print $2}' | awk -F : '{print $2}'  awk一行为单位进行文本分割,默认分隔符为空格或“tab”键, -F 指定分隔符。'{print $2}' 表示输出第二列。

批量改名:

1. 假设有两个以“.log”结尾的文件,想要增加后缀:find . -name "*.log" | xargs -I {} mv {} {}.proc

2. 修改后缀,把proc改为ppp:find ./ -name "*.proc" | sed 's/\(.*\)\.proc$/\1/g' | xargs -I {} mv {}.proc {}.ppp

sed和awk功能远不止这些,只能遇到需要的再去学习。

unix中的正则表达式往往是互通的,参考http://blog.sina.com.cn/s/blog_667725170101alzz.html

注意:有些命令如ls,还有find -name选项,只支持通配符,不支持正则。

六,守护进程,进程组,对话期(session)

每个进程都属于一个进程组,对话期是一个或多个进程组的集合。一个对话期可以有一个单独的控制终端,也就是我们打开shell的时候,会创建一个新的对话期,并且会绑定一个控制终端。
对话期在连接了终端之后,就会有前台进程组和后台进程组之分。

控制终端有如下特点:

1.无论何时键入中断键(如Ctrl-C),则会将中断信号或退出信号送至前台进程组所有进程。前台进程组可以通过终端输入进行交互。

2.终端关闭(检测到调制解调器断开连接)后,会给对话期首进程(控制进程,"登录shell产生")发送挂断信号。

经测试,在关闭了终端后,后端进程组的进程就变成了守护进程,会一直运行下去直到结束。也可以在子进程中通过setsid来让子进程变成守护进程。

ps:关于进程间通信,除了管道,http,信号,消息队列等,还发现父进程可以通过环境变量传递参数和数据给子进程

七,有效ID,实际用户ID

主要是用于exec方法改变子进程权限。参考资料http://blog.csdn.net/demiaowu/article/details/39370355

八,寻求帮助的地方

1. 对于命令,首推 cmd --help 和 man cmd。这两个作为最权威的帮助指南,应该首先被使用。尤其是man命令,会详细的给出使用说明。值得注意的是,man手册分为了几个不同章节,用于区分不同功能的同名命令或函数。

参考http://www.cnblogs.com/hnrainll/archive/2011/09/06/2168604.html

还有一些辅助命令如whatis,whereis等,可以展示一些信息。

2. *,程序员宝地,几乎所有问题都能得到清晰的解答。

3. google

4. baidu,如果有些问题比较特定于中文,还是可以在baidu上解答的。

前前后后也差不多花了一个月的时间学习unix相关知识,整体感受:

1. unix确实值得深入学习,有大量的强有力工具可以帮助我们进行日常操作。以上记录的只是一小部分,保持学习的进程。

2. 至少应该会一门脚本语言,它能方便的和操作系统交互,更高效的利用unix系统已有的各种工具,提供了java等高级语言提供不了的方便性。

3. unix的知识太多太多了,重要的是对实际操作有用的只是,而不是为了学而学。遇到问题了,再去学习是比较好的,否则容易钻进牛角尖,浪费时间。

4. 有些知识用得少忘记了或是理解不充分,这都是正常现象,忘记是常态,重要的是开放的和不害怕的心态,遇到忘记的再学一次就好了,多学多用了就会记牢了。这也反衬了重复阅读的重要性,越是经典的书看一遍越是不够的。随着见识的增长,每次重读都会带来新的体会,螺旋前进。

5. 最后,学习unix知识,man和--help命令是必须要掌握的,这两个帮助选项是最权威的信息,不要害怕有一大片文字内容,挑选所需要的,就足够了。

6. Linux是灵活的,我们总是可以找到许多不同的办法来解决同一个问题。所以,打开思路,充分利用已有工具,提高效率。

上一篇:通过Java代码浅谈HTTP协议


下一篇:HTML 页面源代码布局介绍