前言我在运维的坑里挣扎了好几年。还记得刚开始的时候,只是用了一些简单的命令。写剧本的时候尽量简单,所以有时候出来的剧本又长又臭。像一些高级命令,比如Xargs命令、管道命令、自动响应命令等,如果一开始就知道,我可能也会写出简洁高效的脚本。不管出于什么原因,我想把Linux使用的一些高级命令的用法说明一下,以利他人,也利己。以后不记得了,还可以回头看看。1、实用的xargs命令在平时的使用中,我觉得xargs命令比较重要,也比较方便。我们可以使用此命令将命令的输出作为参数传递给另一个命令。比如我们要找出某个路径下以.conf结尾的文件,并对这些文件进行分类,那么通常的做法是先找出以.conf结尾的文件,然后输出到一个文件中,然后cat文件,并使用文件文件分类命令对输出文件进行分类。这种常用的方法确实有点麻烦,所以这个时候xargs命令就派上用场了。例1:在/目录下查找以.conf结尾的文件,并将文件分类命令:#find/-name*.conf-typef-print|xargsfile输出结果如下:xargs后不仅可以添加files分类命令,还可以添加很多其他的命令,比如比较现实的tar命令,可以使用find命令配合tar命令查找使用find命令找出指定路径下的特殊文件,然后配合tar命令找出文件直接打包,命令如下:#find/-name*.conf-typef-print|xargstarcjftest.tar.gz2.后台运行的命令或脚本有时候我们在进行一些操作的时候,我们不希望我们的操作在终端会话中断之后,就会中断,尤其是一些数据库的导入导出操作.如果涉及到大量数据的操作,我们不能保证我们的网络在操作过程中不会出现问题,所以后台运行脚本或者命令对我们来说是一个很大的保证。例如,如果我们想在后台运行数据库导出操作,并将命令输出记录到文件中,那么我们可以这样做:nohupmysqldump-uroot-pxxxxx--all-databases>./alldatabases.sql&(xxxxxis密码)当然,如果你不想要明文密码,也可以这样做:nohupmysqldump-uroot-pxxxxx--all-databases>./alldatabases.sql(后面不带&符号)执行完以上命令,会提示输入密码,输入密码后,命令还在前台运行,但是我们的目的是后天运行命令。这时候可以按Ctrl+Z,然后输入bg,达到第一个命令的效果,让命令在后台运行。同时,还可以隐藏密码。命令后台执行的结果会在命令执行的当前目录下留下一个nohup.out文件。检查此文件以了解该命令是否执行了错误。3、找出当前系统内存占用高的进程在多次运维中,我们发现内存消耗比较严重,那么如何找出进程的内存消耗顺序呢?命令:#ps-aux|排序-rnk4|head-20输出的第四列是内存消耗百分比。最后一列是相应的过程。4、找出当前系统中CPU占用率高的进程在很多运维过程中,我们发现CPU消耗比较严重,那么如何找出进程消耗CPU的先后顺序呢?命令:#ps-aux|排序-rnk3|head-20输出的第三列是CPU消耗百分比,最后一列是对应的进程。我想大家应该也发现了,sort命令后面的3和4其实分别代表了第三列的排序和第四列的排序。5、同时查看多个日志或数据文件在日常工作中,我们查看日志文件的方式可能是使用tail命令在一个终端查看日志文件,一个终端查看一个日志文件。这也包括我,但有时我觉得这种方法有点麻烦。其实有一个工具叫multitail,可以在同一个终端同时查看多个日志文件。首先安装multitail:#wgetftp://ftp.is.co.za/mirror/ftp.rpmforge.net/redhat/el6/en/x86_64/dag/RPMS/multitail-5.2.9-1.el6.rf。x86_64.rpm#yum-ylocalinstallmultitail-5.2.9-1.el6.rf.x86_64.rpmmultitail工具支持文本高亮显示、内容过滤和您可能需要的更多功能。这里有一个有用的例子:这时候我们想在securelog中查看指定filter关键字的输出,同时也想查看实时网络ping情况:命令如下:#multitail-e"accepted”/var/log/secure-l“pingbaidu.com”是不是很方便?如果我们平时想查看两个日志之间的相关性,可以观察日志输出是否被触发。如果两个终端分开,来回切换可能会浪费时间。这个multitail工具或许是个不错的查看方式。6.继续ping并将结果记录到日志中。很多时候,运维总会听到一个声音,是不是网络出了问题,导致业务出现奇怪的现象,那肯定是服务器网络的问题。这就是俗称的指责。如果业务出现问题,相关人员无法在第一时间找到原因。在许多情况下,问题将归因于服务器网络的问题。这时候你去ping几个包,把结果扔出去,人家就会反驳你。这只是当时的一个问题。现在业务已经恢复正常,网络肯定是正常的。这时候,你很可能会被气死。如果把zabbix等网络监控的数据拿出来,这个时候就不合适了。你不可能把zabbix的数据采集间隔设置成每秒一次吧?小编就遇到了这样的问题。于是,我通过以下命令进行了ping的监控和采集。然后当有人要我背锅的时候,我把问题期间的ping数据库截了下来,大家公开议论纷纷。结果那一次我把责任推了回去。他们以后可不敢轻易背锅。这感觉很好。.命令:pingapi.jpush.cn|awk'{print$0""strftime("%Y-%m-%d%H:%M:%S",systime())}'>>/tmp/jiguang.log&output的结果会记录在/tmp/jiguang.log中,每隔一秒会增加一条新的ping记录,如下:7.查看tcp连接状态指定查看80端口的tcp连接状态,即有助于分析连接是否被释放,或者何时发生攻击进行状态分析。命令:#netstat-nat|awk'{print$6}'|sort|uniq-c|sort-rn8.查找80端口请求数最多的前20个IP,有时候业务请求量突然变大,所以这时候我们可以查看请求的源IP。如果集中在少数IP上,那么就可能存在攻击,我们可以使用防火墙进行阻断。命令如下:#netstat-anlp|grep80|greptcp|awk'{print$5}'|awk-F:'{print$1}'|sort|uniq-c|sort-nr|head-n20九,ssh实现端口转发很多朋友可能听说过ssh是Linux下的远程登录安全协议,是一种流行的远程登录管理服务器。但是应该很少有朋友听说过ssh也可以做端口转发。其实ssh做端口转发的功能还是很强大的,下面做个演示。示例背景:我们公司有一台堡垒机,任何操作都需要在堡垒机上进行。有的开发者需要访问ElasticSearch的头部面板查看集群状态,但是我们不想映射ElasticSearch的9200端口,还是想使用堡垒机访问。这就是为什么对堡垒机(192.168.1.15)的请求被转发到服务器ElasticSearch(192.168.1.19)的9200。示例:将访问本机(192.168.1.15)的9200端口转发到192.168.1.19的9200端口ssh-p22-C-f-N-g-L9200:192.168.1.19:9200ihavecar@192.168.1.19记住:前提是密钥先传完。命令执行后,访问192.168.1.15:9200端口,实际访问的是192.168.1.19:9200端口。
