《Linux运维步步为营》第一章 Linux基础 1.2 Linux命令(2)
接昨天
ps
查看当前进程,可以看到执行ps命令的时刻,系统中有哪些进程,进程的状态是怎样的,占用的各种资源信息。具体参数意义可以通过man查看,这里介绍几种常用的参数组合。ps -A
简短的显示所有进程信息ps -u user
显示指定用户的进程信息ps -ef
显示略详细的进程信息,包含执行进程的命令行ps aux
显示详细的进程信息,包括CPU和内存等的占用以及耗时,包含执行进程的命令行,比上面一个命令多了资源占用信息ps -axjf
以树方式显示进程,可以查看进程的父子关系
这些命令执行后的返回内容使用了各种缩写,这里解释一下常见几列的意义。
S指的是状态(STAT),包含五种状态:D(不可中断)R(运行中)S(睡眠中)T(停止状态)Z(僵死状态) UID:程序拥有者的用户ID PPID:父进程的ID C或%CPU:CPU占用百分比 PRI:进程优先级 SZ:占用掉的内存大小 %MEM:物理内存占用百分比 VSZ:占用的虚拟内存量,单位为KB RSS:占用的固定内存量,单位为KB TTY:执行终端 CMD或COMMAND:执行命令 TIME:占用的CPU时间 START:启动时间
ps命令与grep命令结合起来可以过滤出指定程序的进程信息,比如ps aux | grep php
可以看到包含php的命令的信息。
which
查找指定内容在PATH中的位置。比如你想知道ps命令在系统的什么位置,可以执行which ps,
得到结果一般是/bin/ps,就可以去/bin下寻找ps执行文件。
netstat
查看网络信息,可以用来检查网络端口及连接情况。强大的netstat有很多参数,此处依然是介绍几个常用的组合。netstat -s
按照协议分别统计数据,包括IP,ICMP,ICMPMSG,TCP,UDP,UDPLITE,TCPEXTIPEXT。比如我们觉得服务器网络慢了,或者响应慢了,可以通过这个命令,查看一下各协议的连接状态,比如TCP有多少已连接,多少坏包。netstat -r
显示路由表的信息netstat -a
显示所有有效连接的信息,包括已建立的连接(ESTABLISHED)和监听中的连接(LISTENING)netstat -n
显示所有已建立的有效连接netstat -tulnp
显示所有TPC和UDP使用的端口及占用该端口的进程ID和程序名,此处会直接显示数字而不显示主机名,端口名或用户名,这样更直观一点。netstat -c
可以每隔一秒输出一下网络信息
有几个和其他命令组合使用的如下netstat -plan | grep ":80" | wc -l
查看连接80端口的IP总数netstat -plan | grep ":80" | grep -v "*" | awk {'print $5'} | sed 's/:*f*:*\(.*\)$/\1/p' | cut -d: -f 1 | sort | uniq -c | sort -nrk 1 | head -20
将80端口连接IP分组查看连接数从多到少的前20个IP和它的连接数量,这个可以用来看是不是有IP恶意请求
ifconfig
查看和进行网络配置。一般拿到系统我们主要用这个命令来查看网卡IP,可以在参数中指定网卡或显示所有网卡的信息。反馈的信息包含连接类型,mac地址,IP地址,子网掩码,网卡开启状态,网线连接状态,组播,最大传输单元,收发数据包的统计,收发数据字节数统计这些信息。使用ifconfig配置网卡可以设置静态地址或伪造mac地址,具体用法可以自行谷歌。设置网卡自动获取ip一般dhclient来做。
xargs
这个命令用来将参数列表分段传递给其他命令,避免参数列表过长问题。一个可能的场景就是目录中有超级多的文件,此时直接使用rm命令可能返回“参数列表过长”的错误,结合xargs使用find ./ -type f -print0 | xargs -0 rm -f
可以避免报错。-print0表示输出以null分隔,-0表示输入以null分隔。
crontab
用来设置计划任务,可以对时间进行各种组合。打开crontab其实是编辑文件,每一行为一个任务,格式为“ command”,每个字段以空格分隔,前面五个是对时间的设置,后面为任务命令。5个时间字段从前到后意义分别是分钟(0-59)、小时(0-23)、日期(1-31)、月份(1-12)、星期(0-6,0为星期天)。除了括号中数字的表示,还有几个特殊符号表示,“”、“/”、“-”和“,(英文逗号)”。代表所有取值范围内的数字,/代表每,比如“*/5”表示每5个单位,-代表数字范围,,(英文逗号)表示几个指定数字。举几个例子:
0 12,13 * * * command表示在12:00和13:00分别执行一次命令 0 */2 * * * command表示每2个小时执行一次命令 0 23-7/2,8 * * * command表示晚上11点到早上7点之间每两小时执行一次命令,附带早上8点也执行一次 0 11 4 * 1-3 command 每个月4号和每个星期的星期一到星期三早上11点执行一次命令
一般我们会将执行反馈重定向到文件中,以便事后查看命令执行了没,执行过程有没有报什么内容,是否报错。此处附带讲一下linux的重定向规则
command > filename 把标准输出重定向到一个新文件中 command >> filename 把标准输出重定向到一个文件中(追加) command 1 > fielname 把标准输出重定向到一个文件中 command > filename 2>&1 把标准输出和标准错误一起重定向到一个文件中 command 2 > filename 把标准错误重定向到一个文件中 command 2 >> filename 把标准输出重定向到一个文件中(追加) command >> filename 2>&1 把标准输出和标准错误一起重定向到一个文件中(追加) command < filename >filename2 把command命令以filename文件作为标准输入,以filename2文件作为标准输出 command < filename 把command命令以filename文件作为标准输入 command << delimiter 把从标准输入中读入,直至遇到delimiter分界符 command <&m 把文件描述符m作为标准输入 command >&m 把标准输出重定向到文件描述符m中 command <&- 把关闭标准输入 command 2>&1 把command命令标准错误重定向到标准输出
head
获取文件从前向后指定量的内容。简单但有用的命令,可以指定长度数量,单位包括字节和行。在预览大文件内容时可以使用。
tail
获取文件从后向前指定量的内容。同head类似,不过tail多一个功能,使用-f参数可以让tail跟踪文件的更改,文件有更改时立即显示出来。
cut
截取内容,对付大文件,从中提取一段内容很有用。使用组合很多,就不具体说了,读者可以搜一下。
sort
对内容一行为一个单位进行排序,比如前面对网络信息的处理就用到了它。比较原则为从首字符向后,依次按ASCII码值比较。几个常用参数有:
-r sort默认是按照升序排列的,使用这个参数可以转为降序排列
-u 可以去重
-o 当需要将结果写入到原文件中时,此处不能用重定向,需要使用这个参数。
-n sort可能会认为10比2小,因为1小于2。用这个参数告诉sort,要按照数值来排序,于是10大于2了
-k 指定列数
-t 指定分列的分隔符
wc
这个不是指厕所,是统计指定内容的字节数、字数或行数的命令。
-c 统计字节数
-l 统计行数
-m 统计字符数,不能与-c一起使用
-w 统计字数,有空格、tab或换行分隔
-L 最长行的长度
uniq
去重。常用下面三个参数
-c 显示重复次数
-d 仅显示重复出现的行
-u 仅显示没重复出现的行
ln
建立链接文件,也就是晕到死上的快捷方式。链接分软链接和硬链接,软链接会在指定位置生成一个文件镜像,不占用磁盘空间,硬链接在选定位置生成一个和源文件大小相同的文件,无论哪种链接,文件变化会保持同步。建立软链接用参数-s,如ln -s 源文件 目标文件
,不使用参数则默认硬链接。
who
显示当前有哪些人连接本机,包含用户、终端、时间和IP信息
history
显示当前用户执行命令的历史记录
scp
用于在主机间通过ssh通道复制文件和目录,分本地到远程(scp localfile username@host:remotefile
)和远程到本地(scp username@host:remotefile localfile
)两种方式。
如果需要指定端口,使用-P 端口
参数,使用-r参数递归复制内容
tar
打包命令,可以配合压缩解压使用,具体参数就让谷歌告诉你吧。
除了上文列出的命令之外,还有一些其他有用的命令,比如iostat
和vmstat
,这两个会在后文介绍到,此处就暂不介绍了,感兴趣的可以先问谷歌。