06.命令的组合使用

命令的组合使用

1.查询当前整个系统每个进程的线程数

我们经常遇到这样的问题,比如某台服务器的CPU 使用率飙升,通过top命令查看是某个程序(例如java)占用的cpu比较大,现在需要查询java各个进程下的线程数情况。可以通这一个命令组合实现:

for pid in $(ps -ef|grep -v grep|grep "java"|awk '{print $2}');do echo ${pid} > /tmp/a.txt ;cat /proc/${pid}/status|grep Threads > /tmp/b.txt ; paste /tmp/a.txt /tmp/b.txt;done|sort -k3 –rn

先解释下这个脚本:

#这部分是获取${pid}变量为 java 进程的 pid 号。
for pid in $(ps -ef|grep -v grep|grep java |awk '{print $2}')

这部分是将 java 进程的 pid 号都打印到/tmp/a.txt 文件中。
echo ${pid} > /tmp/a.txt

这部分是将各个 pid 进程号下的线程信息打印到/tmp/b.txt 文件中。
cat /proc/${pid}/status|grep Threads > /tmp/b.txt

这部分是以列的形式展示a.txt和b.txt文件中的信息。
paste /tmp/a.txt /tmp/b.txt

这部分是对输出的信息进行排序,其中,-k3 表示以第三列进行排序,“-rn”表示降序排列。
sort -k3 -rn

将上面命令组合放入系统执行完毕后,输入内容如下:
在这里插入图片描述

从输出可以看出,第一列显示的是 java 的进程号,最后一列显示的每个 java 进程对应的线程数量。这个例子是一个for循环加上ps命令和sort命令综合应用的实例。

2.如何检测系统中的僵尸进程并kill掉

要查找系统中的僵尸进程,有多种方法,这里给出一种命令行探测僵尸进程的方法:

[root@qu ~]# ps -e -o stat,ppid,pid,cmd | egrep '^[Zz]'
Z	10808 10812 [java] <defunct>

介绍下用到的几个参数:

  • -e:参数用于列出所有的进程
  • -o:参数用于设定输出格式,这里只输出进程的 stat(状态信息)、ppid(父进程 pid)、pid(当前进程的 pid),cmd(即进程的可执行文件。
  • egrep:是 linux 下的正则表达式工具
  • ‘[Zz]’:这是正则表达式,表示第一个字符的位置,[Zz],表示小写 z或者大写的Z字母,即表示第一个字符为Z或者z开头的进程数据,只所以这样是因为僵尸进程的状态信息以Z 或者z字母开头。

找到僵尸进程的 pid 后,直接通过”kill -9 pid“命令杀掉即可,但是如果僵尸进程很多的话,就会很繁琐,因此,还需要一个批量删除僵尸进程的办法:

ps -e -o stat,ppid,pid,cmd | grep -e '^[Zz]' | awk '{print $2}' | xargs kill -9

这是个命令组合,通过管道实现命令的组合应用。“grep -e”相当于 egrep命令。“awk ‘{print $2}’ ”是将前面命令的输出信息进行过滤,仅仅输出第二列的值,而第二列就是进程的 ppid。“xargs kill -9”这是将得到的 ppid 传给“kill -9”作为参数,也就是kill 掉这些ppid。xargs命令可以将标准输入转成各种格式化的参数,这里是将管道的输出内容作为参数传递给kill命令。

其实这个命令组合是将僵尸进程的父进程杀掉,进而关闭僵尸进程的,为什么要这么做呢,其实一般僵尸进程很难直接用kill 杀死,因为僵尸进程已经是死掉的进程,它不能再接收任何信号。所以,需要通过 kill 僵尸进程的父进程,这样父进程杀掉后,僵尸进程就成了”孤儿进程”,而所有的孤儿进程都会交给系统的 1 号进程(init 或 systemd)收养,1 号进程会周期性地去调用wait系统调用来清除这些僵尸进程。因此,我们可以发现,父进程杀掉之后,僵尸进程也跟着消失,其实是1号进程作用的结果!

3.如何查看当前占用CPU 或内存最多的几个进程

这个应用需求在服务器的问题排查和故障处理上使用率非常高,要获取这些信息,只需要一些命令组合即可实现,可以说非常简单。

1)获取当前系统占用CPU最高的前10个进程最简单的方式是通过ps命令组合实现,例如:

[root@qu ~]# ps aux|head -1;ps aux|sort -rn -k3|head -10

该命令组合主要分为两个部分:

  • ps aux|head -1
  • ps aux|sort -rn -k3|head -10

其中,第一句主要是为了获取标题(USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND)信息。而“head:-N”可以指定显示的行数,默认显示 10 行。

第二个命令是一个输出加排序组合,ps 参数的 a 指代 all,表示所有的进程,u 指代 user id,就是执行该进程的用户
id,x
指代显示所有程序,不以终端机来区分。

接下来是 sort 命令,其中:

  • r 指代 reverse,这里是指反向比较结果,输出时默认从小到大,反向后从大到小。
  • n 指代 numberic sort,根据其数值排序。
  • k 代表根据哪一列进行排序,后面的数字 3 表示按照第 3 列排序。本例中,可以看到%CPU 在第 3 个位置,因此k3 表示根据%CPU 的数值进行由大到小的排序。

接下来的“|”为管道符号,将查询出的结果导到下面的命令中进行下一步的操作。最后的“head -10”命令获取默认前 10 行数据。

2)获取当前系统占用内存最高的前10个进程

同理,要获取系统占用内存最高的前10个进程,方法与获取cpu方法一致,命令组合修改为如下即可:

[root@qu ~]# ps aux|head -1;ps aux|sort -rn -k4|head -10

这里仅仅修改了k3位k4,4代表第4列排序。本例中,可以看到%MEM在第4个位置,因此k4表示根据% MEM的数值进行由大到小的排序。

4.如何对文件进行连接、合并、排序、去重

4.1.文件连接命令 join

join 命令用于将两个文件中,指定列中内容相同的行连接起来。找出两个文件中,指定列内容相同的行,并加以合并,再输出到标准输出设备。

常用的参数以及含义如下表所示:

参数

含义

-t

join 默认以空格符分隔数据,并且比对第一个字段的数据,如果两个文件相同,则将两笔数据联成一行,且第一个字段放在行首

-i

忽略大小写的差异

-1

这个是数字的 1 ,代表第一个文件要用哪个字段来分析的意思

-2

代表第二个文件要用哪个字段来分析的意思

看一个例子:file1 文件的内容:

[root@localhost ~]# cat file1.txt 
root:x:0:0:root:/root:/bin/bash 
bin:x:1:1:bin:/bin:/sbin/nologin 
daemon:x:2:2:daemon:/sbin:/sbin/nologin 
adm:x:3:4:adm:/var/adm:/sbin/nologin 
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 
sync:x:5:0:sync:/sbin:/bin/sync 
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

file2文件的内容:

[root@localhost ~]# cat file2.txt 
root:x:0:
bin:x:1: 
daemon:x:2: 
sys:x:3:
adm:x:4:
tty:x:5:
disk:x:6:
lp:x:7:
mem:x:8:

要从 file1.txt 和 file2.txt 中可以看出,file1.txt 中以“:“分割的第三列和 file2.txt 中以“:“分割的第三列内容相同,因此这两个文件可以合并整合在一起,看下面这个操作:

[root@localhost ~]#join -t ':' -1 3 file1.txt -2 3  file2.txt 
0:root:x:0:root:/root:/bin/bash:root:x: 
1:bin:x:1:bin:/bin:/sbin/nologin:bin:x: 
2:daemon:x:2:daemon:/sbin:/sbin/nologin:daemon:x: 
3:adm:x:4:adm:/var/adm:/sbin/nologin:sys:x: 
4:lp:x:7:lp:/var/spool/lpd:/sbin/nologin:adm:x: 
5:sync:x:0:sync:/sbin:/bin/sync:tty:x:
6:shutdown:x:0:shutdown:/sbin:/sbin/shutdown:disk:x:

可以看出,通过-t选项指定了分隔符后,输出的内容是将file1.txt文件的第三列和file2.txt 文件的第三列进行整合的结果,两个文件合并后,相同的字段部分被移动到每行最前面了。

4.2.合并文件列命令paste

paste 命令用于合并文件的列。它会把每个文件以列对列的方式,一列列地加以合并。paste 比join 简单很多,它其实就是直接将两个文件中相同的两行贴在一起,且中间以 [tab]键隔开而已。

例如对上面的 file1.txt 和file2.txt 进行 paste 合并,执行结果如下:

[root@qu ~]# paste file1.txt file2.txt 
root:x:0:0:root:/root:/bin/bash 	root:x:0:
bin:x:1:1:bin:/bin:/sbin/nologin 	bin:x:1: 
daemon:x:2:2:daemon:/sbin:/sbin/nologin 	daemon:x:2: 
adm:x:3:4:adm:/var/adm:/sbin/nologin 	sys:x:3:
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 	adm:x:4:
sync:x:5:0:sync:/sbin:/bin/sync 	tty:x:5:
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown	disk:x:6:
halt:x:7:0:halt:/sbin:/sbin/halt	lp:x:7:
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin	mem:x:8:

接着,再看一个组合例子:

[root@qu ~]# cat /etc/group|paste /etc/passwd /etc/shadow -|head -n 3
root:x:0:0:root:/root:/bin/bash	root:$6$itBvz.u4iA5xf22B$LIlL6/QaOUOlEk8THDtlVYv0jU9ByBDIqyaKqaXBvpLbKnez359YtwnrRaXkHdkY9t/lhPe5xzvmfGaprwFEh/::0:99999:7:::	root:x:0:
bin:x:1:1:bin:/bin:/sbin/nologin	bin:*:18353:0:99999:7:::	bin:x:1:
daemon:x:2:2:daemon:/sbin:/sbin/nologin	daemon:*:18353:0:99999:7:::	daemon:x:2:

这个例子的重点在那个“-”的使用,那玩意代表标准输入,在这里会接收/etc/group 的内容,因为通过“cat /etc/group”将此文件内容送到了标准输入,而“-”刚好接收了这个内容。因此,这个组合其实是三部分文件内容的合并,分别是/etc/passwd、/etc/shadow和/etc/group三个文件内容合并的结果,而每行内容中通过默认的[tab]键隔开。

4.3.文本内容排序命令sort

sort 这个命令很好用,主要用做排序,基本使用格式为:

sort [-t 分隔符] [-kn1,n2] [-nru]

参数含义如下表所示:


参数

含义

-n

使用纯数字进行排序,默认是以字母顺序来排序的

-r

反向排序

-u

就是 uniq ,相同的数据中,仅出现一行代表

-t

分隔符,默认是用 [tab] 键来分隔

-k

以那个区间(field)来进行排序的意思

先看最简单的一个例子:

[root@qu ~]# cat /etc/passwd | sort | head 
adm:x:3:4:adm:/var/adm:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
halt:x:7:0:halt:/sbin:/sbin/halt
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin

这是最简单的一个sort排序,没指定任何参数,所以默认以英文字母顺序进行排序, head是默认显示前10行数据,要显示指定行数据,可以通过“head -N”实现。

继续看下面这个例子:

[root@qu ~]# cat /etc/passwd | sort -t ':' -k3 -n | head
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin

这个例子是通过指定分隔符’:‘,然后对指定的列进行排序,k3表示以’:'作为分隔符的第三列,也就是以第三列为准进行排序,由于第三列都是数字,所以还需要“-n”参数。


4.4.检查并删除文件中的重复行命令uniq

uniq主要用于检查及删除文本文件中重复出现的行,一般与sort命令结合使用,常用参数如下表所示:

参数

含义

-c 或–count

在每列旁边显示该行重复出现的次数

-d:或–repeated

仅显示重复出现的行列

看下面例子:这是ixdbafile1 文件的内容:

[root@qu ~]# cat ixdbafile1
server 188
server 188
server 188
jenkins 66
jenkins 66
oracle 90
oracle 90
oracle 90
saybye 122
saybye 122
saybye 122
saybye 122

可以看到有重复行,并且重复行都是相邻的,要删除重复行,uniq 就派上用场了,看下面例子:

[root@qu ~]# uniq ixdbafile1
server 188
jenkins 66
oracle 90
saybye 122

可以看到,已经删除了重复行。如果要统计重复行出现的次数,加上“-c”参数即可,看下面这个例子:

[root@qu ~]# uniq ixdbafile1 -c
3 server 188
2 jenkins 66
3 oracle 90
4 saybye 122

上面的 ixdbafile1 文件有些特殊,因为实际使用中,重复行不可能都是相邻在一起的,那继续来看另一个文件内容:

[root@qu ~]# cat ixdbafile2
server 188
saybye 122
jenkins 66
server 188
saybye 122
jenkins 66
server 188
saybye 122
jenkins 66
oracle 90
redis 126

这是个重复行不相邻的文件,实际环境中,很多都是类似这样的文件,再通过uniq看看是否能够删除重复行,执行如下操作:

[root@qu ~]# uniq ixdbafile2
server 188
saybye 122
jenkins 66
server 188
saybye 122
jenkins 66
server 188
saybye 122
jenkins 66
oracle 90
redis 126

可以看到,文件原样输出了,也就是说 uniq 对这些重复行不相邻的内容无能为力了,怎么办呢,现在是时候该sort出场了,sort 我们知道是排序用的,那就先把这个文件进行排序,这样,重复行不就自动相邻了吗,看下面操作:

[root@qu ~]# sort ixdbafile2
jenkins 66
jenkins 66
jenkins 66
oracle 90
redis 126
saybye 122
saybye 122
saybye 122
server 188
server 188
server 188

经过 sort 排序后,重复行相邻了,接着通过管道后面接 uniq 命令即可过滤删除重复行了,看下面操作:

[root@qu ~]# sort ixdbafile2|uniq
jenkins 66
oracle 90
redis 126
saybye 122
server 188

果然,经过sort排序后,uniq又可以正常工作了,这也是为什么sort经常和uniq一起使用的原因了。

下面这个是使用了 uniq 的“-d”参数,也就是显示重复行有哪些:

[root@qu ~]# sort ixdbafile2|uniq -d
jenkins 66
saybye 122
server 188

几个简单例子,发现 uniq 很简单。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/608981.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Reactor Netty HTTP 服务器端-响应式编程-014

🤗 ApiHug {Postman|Swagger|Api...} = 快↑ 准√ 省↓ GitHub - apihug/apihug.com: All abou the Apihug apihug.com: 有爱,有温度,有质量,有信任ApiHug - API design Copilot - IntelliJ IDEs Plugin | Marketplace The Next Generation API Development Platform …

风扇开启执行逻辑

执行流程 public static void businessExecutionWork(){//以下为业务逻辑部分System.out.println("1、根据电池包控制风扇服务执行 开始!");//1、获取电池包电压、电流、环境温度//获取电池包电压、电流、环境温度ObtainBatteryDataService obtainBatteryDataServic…

Docker 怎么将映射出的路径设置为非root用户权限

在Docker中&#xff0c;容器的根文件系统默认是由root用户拥有的。如果想要在映射到宿主机的路径时设置为非root用户权限&#xff0c;可以通过以下几种方式来实现&#xff1a; 1. 使用具有特定UID和GID的非root用户运行容器&#xff1a; 在运行容器时&#xff0c;你可以使用-u…

监控异地组网怎么组网?

监控异地组网是指在不同地域的网络环境下&#xff0c;实现对监控设备的远程访问和管理。在传统的网络环境下&#xff0c;由于网络限制和设备配置等问题&#xff0c;监控设备的远程访问往往受到一定的限制和困扰。为了解决这个问题&#xff0c;引入了天联组网技术&#xff0c;实…

Mysql幻读

幻读指的是一个事务在前后两次查询同一个范围的时候&#xff0c;后一次查询看到了前一次查询没有看到的行。 幻读仅专指“新插入的行” 在可重复读隔离级别下&#xff0c;普通的查询是快照读&#xff0c;是不会看到别的事务插入的数据的。因此&#xff0c;幻读在“当前读”下…

【JavaEE网络】HTTP/HTTPS协议的工作原理与格式详解

目录 HTTP/HTTPSHTTP是什么理解“应用层协议”理解HTTP协议的工作过程HTTP协议格式 HTTP/HTTPS HTTP是什么 应用层&#xff0c;一方面是需要自定义协议&#xff0c;一方面也会用到一些现成的协议 HTTP及HTTPS是应用层重点协议 使用浏览器&#xff0c;打开网站&#xff0c;这…

自动化运维工具——Ansible

一、Ansible的概念&#xff1a; 1.Ansible的介绍&#xff1a; Ansible是一个基于Python开发的配置管理和应用部署工具&#xff0c;现在也在自动化管理领域大放异彩。它融合了众多老牌运维工具的优点&#xff0c;Pubbet和Saltstack能实现的功能&#xff0c;Ansible基本上都可以…

OpenHarmony 实战开发(南向)-Docker编译环境搭建

Docker环境介绍 OpenHarmony为开发者提供了两种Docker环境&#xff0c;以帮助开发者快速完成复杂的开发环境准备工作。两种Docker环境及适用场景如下&#xff1a; 独立Docker环境&#xff1a;适用于直接基于Ubuntu、Windows操作系统平台进行版本编译的场景。 基于HPM的Docker…

2024车载测试还有发展吗?

2024年已过接近1/4了,你是不是还在围观车载测试行业的发展? 现在入车载测试还来得及吗? 如何高效学习车载测试呢? 首先我们看一下车载测试行情发展,通过某大平台,我们后去数据如下: 这样的数据可以预估一下未来车载测试还是会持续发展. 随着科技的发展和汽车行业的不断创新,…

第08章 IP分类编址和无分类编址

8.1 本章目标 了解IP地址的用途和种类了解分类编址和无分类编址区别掌握IP地址、子网掩码、网关概念及使用掌握子网划分及超网划分方法掌握无分类编址的改变和使用 8.2 IP地址的用途和种类 分类编址&#xff1a;造成地址的浪费&#xff0c;以及地址不够用&#xff1b;无分类编…

labview技术交流-字符串数组连接成字符串

应用场景 我们可能需要将一维的字符串数组转换成一整条字符串&#xff0c;然后方便记录在数据库或表格中的一个单元格中。 代码展示 方案一 我们使用for循环完成这样的功能需求&#xff0c;见下图&#xff1a; 这种方案可能相对基础和普通&#xff0c;但是它更方便和易于扩展…

在Flask中使用Celery完成异步和定时任务(Flask、Celery、Redis)

编程目标 通过使用Flask和Celery&#xff0c;实现一个简单的Web应用程序&#xff0c;能够接收HTTP POST请求&#xff0c;并异步发送电子邮件。 说明 使用Flask创建一个简单的Web应用程序&#xff0c;包含一个HTTP POST路由&#xff0c;用于接收发送电子邮件的请求。使用Cele…

【Java SE】对象的比较

&#x1f970;&#x1f970;&#x1f970;来都来了&#xff0c;不妨点个关注叭&#xff01; &#x1f449;博客主页&#xff1a;欢迎各位大佬!&#x1f448; 本期内容满满干货&#xff0c;将会深入介绍对象与对象之间是如何进行比较的&#xff0c;我们知道基本数据类型是可以直…

使用 docker-compose 搭建个人博客 Halo

说明 我这里使用的是 Halo 作为博客的工具&#xff0c;毕竟是开源了&#xff0c;也是使用 Java 写的嘛&#xff0c;另外一点就是使用 docker 来安装&#xff08;自动挡&#xff0c;不用自己考虑太多的环境因素&#xff09;&#xff0c;这样子搭建起来更快一点&#xff0c;我们…

【STM32 |新建一个工程】基于标准库(库函数)新建工程

目录 STM32开发方式 库函数文件夹 建工程步骤 库函数工程建立 建立工程总结 STM32开发方式 目前stm32的开发方式主要有基于寄存器的方式、基于标准库的方式&#xff08;库函数的方式&#xff09;、基于HAL库的方式基于库函数的方式是使用ST官方提供的封装好的函数&…

17、线上系统中垃圾回收参数的精准调校指南

17.1、前文回顾 在上一篇文章中,我们已经通过逐步的图解方式,详细解释了CMS垃圾回收的运行机制。简单来说,CMS垃圾回收器采用了四个阶段来进行垃圾回收,以尽量避免长时间的“Stop the World”现象。这四个阶段分别是:初始标记、并发标记、重新标记和并发清理。 在初始标…

AlphaFold 3 可以预测所有生命分子的结构和相互作用

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

《二十二》Qt 音频编程实战---做一个音频播放器

1.UI界面制作 作为一个音乐播放器&#xff0c;最基础的肯定就是播放、暂停、上一首以及下一首&#xff0c;为了使这个界面好看一点&#xff0c;还加入了音量控制、进度条、歌曲列表等内容&#xff0c;至于这种配色和效果好不好看&#xff0c;我也不知道&#xff0c;个人审美一如…

【Java基础】数学相关的方法

基本方法 Return TypeFunctionDescriptionstatic doublerandom()返回值为 double&#xff0c;值为正号&#xff0c; ≥0.0 <1.0static 数值类型abs(数值类型 a)返回值为a的绝对值static doublepow(double a, double b)将第一个参数的值返回到第二个参数的幂static doublesq…

Taro 快速开始

大家好我是苏麟 , 今天聊聊Trao. 官网 : Taro 介绍 | Taro 文档 (jd.com) 点击快速开始 全局安装 CLI 初始化一个项目 选择配置 : 根据自己需求选择 安装失败先不用管 , 用前端工具打开项目 npm install 安装 , 显示安装失败 怎么解决 ? : 查看报错信息 百度 , 问 AI 工具 运…
最新文章