最近学习了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. stackoverflow,程序员宝地,几乎所有问题都能得到清晰的解答。

3. google

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

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

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

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

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

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

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

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

最近学习linux命令的一个总结的更多相关文章

  1. 学习linux命令,看这篇2w多字的linux命令详解

    用心分享,共同成长 没有什么比每天进步一点点更重要了 本文已收录到我的github:https://github.com/midou-tech/articles/tree/master/docs/li ...

  2. 20155228 基于VirtualBox安装Ubuntu和学习linux命令的学习经历和心得

    一.虚拟机VirtualBox的下载安装 基于VirtualBox虚拟机安装Ubuntu图文教程 虽然娄老师的教程对于VirtualBox的下载安装讲的很简单,可以说是一笔带过,但是我在下载安装的过程 ...

  3. Linux命令每日一个

    2014-3-31 1:39 (1)tree linux以树状的结构显示当前目录及其包含的子目录下的文件 #apt-get install tree #tree   //在当前目录下直接使用该命令即可 ...

  4. 安装软件 学习linux命令

    nm -D /usr/lib64/libstdc++.so.6 | grep GLIBCnm dumps named symbols, -D for dynamic libs, and grep fo ...

  5. 别出心裁的Linux命令学习法

    别出心裁的Linux命令学习法 操作系统操作系统为你完成所有"硬件相关.应用无关"的工作,以给你方便.效率.安全.操作系统的功能我总结为两点:管家婆和服务生: 管家婆:通过进程.虚 ...

  6. 20155229付钰涵-虚拟机安装及LINUX命令学习

    安装Ubuntu遇到的问题 问题一: 新建虚拟电脑的版本只有32-bit,与老师所给教程中的64-bit不符.为此我上百度搜寻了答案. 第一种方法: 控制面板--程序与功能--启动或关闭windows ...

  7. 零基础学习Linux必会的60个常用命令

    Linux必学的60个命令Linux提供了大量的命令,利用它可以有效地完成大量的工 作,如磁盘操作.文件存取.目录操作.进程管理.文件权限设定等.所以,在Linux系统上工作离不开使用系统提供的命令. ...

  8. 学习Linux须知1.2之Linux命令的实战

    (一)学习Linux 的准备工作 1.在线学习linux 学习网站推荐:Linux 基础入门_Linux - 蓝桥云课 (lanqiao.cn) 2.连接远程服务器学习[下文的案例就是使用xshell ...

  9. Linux命令对应的英文及整体学习法

    linux命令 注意一下内容收集与互联网,如果觉得有版权问题,请联系. 用Linux命令的时候,如果熟悉对应英文的含义,更有助于理解相应的命令.man: Manual 意思是手册,可以用这个命令查询其 ...

随机推荐

  1. Character类的2个定义大小写方法以及charAt(int index)方法

    API文档charAt(int index)是这样定义的: charAt(char index):Returns the char value at the specified index.在指定的索 ...

  2. 一起买beta版本文档报告汇总

    一起买beta版本文档报告汇总 031402401鲍亮 031402402曹鑫杰 031402403常松 031402412林淋 031402418汪培侨 031402426许秋鑫 一.Beta版本冲 ...

  3. Python之import

    今天写了一个很简单的111.py文件(模块),用命令行直接import 111报错:syntaxerror:invalid systax 从网上查了一下,原因有如下集中: 1,所导入模块没有sys.p ...

  4. 承接Unity3D外包公司 — 技术分享

    Cardboard SDK for Unity的使用 上一篇文章作为系列的开篇,主要是讲了一些虚拟现实的技术和原理,本篇就会带领大家去看一看谷歌的Cardboard SDK for Unity,虽然目 ...

  5. Mybatis原理分析之二:框架整体设计

    1.引言 本文主要讲解Mybatis的整体程序设计,理清楚框架的主要脉络.后面文章我们再详细讲解各个组件. 2.整体设计 2.1 总体流程 (1)加载配置并初始化       触发条件:加载配置文件 ...

  6. 读取 java.nio.ByteBuffer 中的字符串(String) 写入方式flash.utils.ByteArray.writeUTF

    通过研究ByteArray的写入格式以及方法说明,可以发现writeUTF是先使用2位写入字符串的长度,然后在其后写入字符串编码. flash.utils.ByteArray.writeUTF(val ...

  7. SQL2008 清除日志

    USE [master] GO ALTER DATABASE BizTest SET RECOVERY SIMPLE WITH NO_WAIT GO ALTER DATABASE BizTest SE ...

  8. android中Json的一些应用

    JSON(JavaScript Object Notation) :一种轻量级的数据交换格式,基于JavaScript的一个子集. JSON采用完全独立于语言的文本格式,使JSON成为理想的数据交换语 ...

  9. Java 对象,数组 与 JSON 字符串 相互转化

    当 Java 对象中包含 数组集合对象时,将 JSON 字符串转成此对象. public class Cart{} public class MemberCoupon{} public class C ...

  10. C++11 lambda的理解

    C++11 的 lambda 表达式规范如下: [ capture ] ( params ) mutable exception attribute -> ret { body } (1) [ ...