[Linux]常用命令之【netstat/ps/lsof/ss/kill/】#进程/服务/端口#

查看系统中最近的端口连接记录

[root@sdc01 ~]# lsof -Pnl +M -i4 | grep "154"
sshd     30963        0    3u  IPv4  65160732      0t0  TCP 10.yy.xx.146:22->10.yy.xx.154:53374 (ESTABLISHED)

[root@sdc01 ~]# lsof -Pnl +M -i4 | grep "152"
java      9130     1011  715u  IPv4 360506799      0t0  TCP 10.yy.xx.146:10000->10.yy.xx.152:64632 (ESTABLISHED)
java      9130     1011  742u  IPv4 360838960      0t0  TCP 10.yy.xx.146:10000->10.yy.xx.152:58831 (ESTABLISHED)
java      9130     1011  753u  IPv4 360494518      0t0  TCP 10.yy.xx.146:10000->10.yy.xx.152:53166 (ESTABLISHED)
java      9130     1011  772u  IPv4 360496828      0t0  TCP 10.yy.xx.146:10000->10.yy.xx.152:53993 (ESTABLISHED)

查看指定端口/服务所占用的端口

netstat

命令参数详解

  • -t (tcp) 仅显示tcp相关选项
  • -u (udp)仅显示udp相关选项
  • -n 拒绝显示别名,能显示数字的全部转化为数字
  • -l 仅列出在Listen(监听)的服务状态
  • -p 显示建立相关链接的程序名
  • -a, --all display all sockets (default: connected)
  • --interface=iface , -i 显示所有网络接口列表或者是指定的 iface
  • --statistics , -s 显示每种协议的统计信息
  • --route / -r 显示内核路由表
  • -W Wide display

查看网络路由情况

/ # netstat -r
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
default         172.16.0.193    0.0.0.0         UG        0 0          0 eth0
10.xx.19.0      172.16.0.193    255.255.255.0   UG        0 0          0 eth0
zzz.254.xxx.254 172.16.0.193    255.255.255.255 UGH       0 0          0 eth0
172.16.0.0      *               255.255.0.0     U         0 0          0 eth0

查看连接详细情况

netstat -W

查看指定端口的占用情况

[root@johnnyzen ~]# netstat -antp | grep 9876
Proto(协议) | Recv-Q | Send-Q | Local Address(本机[入站]端口) | Foreign Address(远端[入站]端口) | State(状态) | PID/Program name(进程ID/程序名称)
tcp        0      0 0.0.0.0:9876                0.0.0.0:*                   LISTEN      50264/java

[root@johnnyzen ~]# netstat -tunlp | grep 57083
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
tcp        0      0 0.0.0.0:57083           0.0.0.0:*               LISTEN      15721/mongod   

统计:不同状态的 TCP连接

netstat -an|awk '/tcp/ {print $6}'|sort|uniq -c
# 统计:TCP连接状态
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a,S[a]}'

netstat -n  | grep -i 9527 | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a,S[a]}'
  • CLOSED:无连接是活动的或正在进行
  • LISTEN:服务器在等待进入呼叫
  • SYN_RECV:一个连接请求已经到达,等待确认
  • SYN_SENT:应用已经开始,打开一个连接
  • ESTABLISHED:正常数据传输状态
  • FIN_WAIT1:应用说它已经完成
  • FIN_WAIT2:另一边已同意释放
  • TIMED_WAIT:等待所有分组死掉
  • CLOSING:两边同时尝试关闭
  • TIME_WAIT:另一边已初始化一个释放
  • LAST_ACK:等待所有分组死掉

根据指定端口,监控网络客户端连接

netstat -n | grep tcp | grep 侦听端口
  # 监控 客户端连接详情

netstat -n | grep tcp | grep 侦听端口 | wc -l
  # 统计 客户端连接数

CLOSED:无连接是活动的或正在进行
LISTEN:服务器在等待进入呼叫
SYN_RECV:一个连接请求已经到达,等待确认
SYN_SENT:应用已经开始,打开一个连接
ESTABLISHED:正常数据传输状态
FIN_WAIT1:应用说它已经完成
FIN_WAIT2:另一边已同意释放
TIMED_WAIT:等待所有分组死掉
CLOSING:两边同时尝试关闭
TIME_WAIT:另一边已初始化一个释放
LAST_ACK:等待所有分组死掉

TIME_WAIT 状态的意义? 
	客户端与服务器端建立TCP/IP连接后关闭SOCKET后,此时服务器端连接的端口的状态为TIME_WAIT

是不是所有执行主动关闭的socket都会进入 TIME_WAIT 状态呢?
	主动关闭的一方在发送最后一个 ack 后就会进入 TIME_WAIT 状态 停留2MSL(max segment lifetime)时间这个是TCP/IP必不可少的,
	也就是“解决”不了的。也就是TCP/IP设计者本来是这么设计的

主要有两个原因
1 防止上一次连接中的包,迷路后重新出现,影响新连接(经过2MSL,上一次连接中所有的重复包都会消失)
2 可靠的关闭TCP连接
	在主动关闭方发送的最后一个 ack(fin) ,有可能丢失,这时被动方会重新发fin。
	如果这时主动方处于 CLOSED 状态 ,就会响应 rst 而不是 ack。
	所以,主动方要处于 TIME_WAIT 状态,而不能是 CLOSED 。
	TIME_WAIT 并不会占用很大资源的,除非受到攻击。
	还有,如果一方 send 或 recv 超时,就会直接进入 CLOSED 状态

lsof

lsof := lists openfiles := 列出打开文件

强烈推荐: Linux lsof命令 - CSDN
强烈推荐: Linux 命令神器:lsof - 简书
lsof 常与 ulimit的文件句柄数问题关联:
强烈推荐: [Linux]常用命令之【ulimit(资源限制)】 - 博客园/千千寰宇

命令详解

选项 描述
-a 列出打开文件存在的进程;
-c<进程名> 列出指定进程所打开的文件;
-g 列出GID号进程详情;
-d<文件号> 列出占用该文件号的进程;
+d<目录> 列出目录下被打开的文件;
+D<目录> 递归列出目录下被打开的文件;
-n<目录> 列出使用NFS的文件;
-i<条件> 列出符合条件的进程。(4、6、协议、:端口、 @ip )
-p<进程号> 列出指定进程号所打开的文件;
-u 列出UID号进程详情;
-h 显示帮助信息;
-v 显示版本信息。
lsof -i:8080:查看8080端口占用
lsof abc.txt:显示开启文件abc.txt的进程
lsof -c abc:显示abc进程现在打开的文件
lsof -c -p 1234:列出进程号为1234的进程所打开的文件
lsof -g gid:显示归属gid的进程情况
lsof +d /usr/local/:显示目录下被进程开启的文件
lsof +D /usr/local/:同上,但是会搜索目录下的目录,时间较长
lsof -d 4:显示使用fd为4的进程
lsof -i -U:显示所有打开的端口和UNIX domain文件

简单示例

  • 列出所有打开的文件
[root@localhost~]# lsof
command     PID USER   FD      type             DEVICE     SIZE       NODE NAME
init          1 root  cwd       DIR                8,2     4096          2 /
init          1 root  rtd       DIR                8,2     4096          2 /
init          1 root  mem       REG                8,2  1722304    7823915 /lib64/libc-2.5.so
migration     2 root  cwd       DIR                8,2     4096          2 /
migration     2 root  txt   unknown                                        /proc/2/exe
ksoftirqd     3 root  cwd       DIR                8,2     4096          2 /
  • 查看:符合条件的进程详情
# lsof -i[46] [protocol][@hostname|hostaddr][:service|port]
  46 -> IPv4 or IPv6
  protocol -> TCP or UDP
  hostname -> Internet host name
  hostaddr -> IPv4位置
  service -> /etc/service中的 service name (可以不只一个)
  port -> 端口号 (可以不只一个)

如: lsof -i:8080
如: 使用@host来显示指定到指定主机的连接 
  • 使用@host来查看指定到指定主机的连接
# lsof  -i@172.16.12.5
sshd  7892 root 3u  IPv6  6757 TCP 10.10.1.5:ssh->172.16.12.5:49901  (ESTABLISHED)
  • 找出已建立的连接
# lsof  -i -sTCP:ESTABLISHED
或 
# lsof  -i |  grep  -i ESTABLISHED

firefox-b 169 daniel 49u  IPv4  0t0 TCP 1.2.3.3:1863->1.2.3.4:http (ESTABLISHED)
  • 查看:指定端口的进程是否在线 / 查看: 【指定端口】【当前实际】的打开文件句柄的详情
# sudo lsof -i:6888
COMMAND   PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
java    64812 root  100u  IPv4 4135639      0t0  TCP *:6888 (LISTEN)
  • 查看:【指定进程】【当前实际】占用的文件句柄详情
lsof | grep <pid> 
  # 进程名称 / PID / 进程所有者 / 文件描述符 / 文件类型
  • 查看:【指定进程】【当前实际】的打开文件数
lsof | grep <pid> | wc -l 
  # 进程名称 / PID / 进程所有者 / 文件描述符 / 文件类型
  • 查看【系统(所有进程)】【当前实际】打开的文件数量
lsof | wc -l 
  • 查看:【各个进程】【当前实际】的打开文件数
lsof -n|awk '{print $2}'|sort|uniq -c|sort -nr|more

返回参数详解

COMMAND:进程的名称
PID:进程标识符
PPID:父进程标识符(需要指定-R参数)
USER:进程所有者
PGID:进程所属组
FD:文件描述符,应用程序通过文件描述符识别该文件。
type: 文件类型
DEVICE:指定磁盘的名称
SIZE:文件的大小
NODE:索引节点(文件在磁盘上的标识)
NAME:打开文件的确切名称

FD : 文件描述符列表

cwd:表示current work dirctory,即:应用程序的当前工作目录,这是该应用程序启动的目录,除非它本身对这个目录进行更改
txt:该类型的文件是程序代码,如应用程序二进制文件本身或共享库,如上列表中显示的 /sbin/init 程序
lnn:library references (AIX)(库引用);
er:FD information error (see NAME column)(fd信息错误);
jld:jail directory (FreeBSD)(监控目录);
ltx:shared library text (code and data)(共享库文本);
mxx :hex memory-mapped type number xx(十六进制内存映射类型号xx);
m86:DOS Merge mapped file(DOS合并映射文件);
mem:memory-mapped file(内存映射文件);
mmap:memory-mapped device(内存映射设备);
pd:parent directory(父目录);
rtd:root directory(跟目录);
tr:kernel trace file (OpenBSD)(内核跟踪文件);
v86 VP/ix mapped file(VP/IX映射文件);
0:表示标准输出
1:表示标准输入
2:表示标准错误

一般在标准输出、标准错误、标准输入后还跟着文件状态模式:

u:表示该文件被打开并处于读取/写入模式。
r:表示该文件被打开并处于只读模式。
w:表示该文件被打开并处于。
空格:表示该文件的状态模式为unknow,且没有锁定。
-:表示该文件的状态模式为unknow,且被锁定。

同时,在文件状态模式后面,还跟着相关的锁:

N:for a Solaris NFS lock of unknown type(对于未知类型的Solaris NFS锁);
r:for read lock on part of the file(用于对文件的一部分进行读取锁定);
R:for a read lock on the entire file(整个文件的读取锁定);
w:for a write lock on part of the file;(文件的部分写锁)
W:for a write lock on the entire file;(整个文件的写锁)
u:for a read and write lock of any length(对于任意长度的读写锁);
U:for a lock of unknown type(对于未知类型的锁);
x:for an SCO OpenServer Xenix lock on part of the file(对于文件的sco openserver xenix锁);
X:for an SCO OpenServer Xenix lock on the entire file(对于整个文件的sco openserver xenix锁);
space:if there is no lock(如果没有锁).

TYPE : 文件类型

type/文件类型:
  DIR:表示目录。
  CHR:表示字符类型。
  BLK:块设备类型。
  UNIX: UNIX 域套接字。
  FIFO:先进先出 (FIFO) 队列。
  IPv4:网际协议 (IP) 套接字。
  DEVICE:指定磁盘的名称
  SIZE:文件的大小
  NODE:索引节点(文件在磁盘上的标识)
  NAME:打开文件的确切名称

ss -lnp

root@kylin-sdc153:/opt/govern/govern_1/domains/mydomain/logs# ss -lnp | grep 6888
tcp    LISTEN     0      512       *:6888                  *:*                   users:(("java",pid=64812,fd=100))

ps

ps -ef

root@kylin-sdc153:/opt/govern/govern_1/domains/mydomain/logs# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
...
root     70066     2  0 8月03 ?       00:00:00 [kworker/61:0]
root     70139     2  0 8月03 ?       00:00:00 [kworker/84:2]
root     70146     2  0 8月03 ?       00:00:00 [kworker/91:2]
...

root@kylin-sdc153:/opt/govern/govern_1/domains/mydomain/logs# ps -ef | grep 6888
root     66251 64699  0 10:05 pts/4    00:00:00 grep --color=auto 6888

root@kylin-sdc153:/opt/govern/govern_1/domains/mydomain/logs# ps -ef | grep apusic
root     64713 60453  0 09:59 pts/3    00:00:00 /bin/sh ./startapusic
root     64812 64713 77 09:59 pts/3    00:04:04 /usr/bin/java -Djava.endorsed.dirs=/opt/govern/govern_1/lib/endorsed -Dcom.apusic.domain.home=/opt/govern/govern_1/domains/mydomain -server -Djava.net.preferIPv4Stack=true -Djava.security.egd=file:/dev/./urandom -Xms1024m -Xmx2048m -XX:MaxPermSize=512m -javaagent:/opt/sefon-secure/secure-agent.jar -classpath .:/opt/govern/govern_1/classes:/opt/govern/govern_1/...
2.0.0.jar:/opt/govern/govern_1/lib/ext/*.zip/opt/govern/govern_1/domains/mydomain/lib/*.zip:/opt/govern/govern_1/domains/mydomain/lib/*.jar: com.apusic.server.Main -root /opt/govern/govern_1
...

查看【内存】占用TopN的进程

N=10

ps -aux|head -1;ps -aux|sort -k4nr|head -10

查看【CPU】占用TopN的进程

N=5

ps -aux | sort -k3nr | head -5

杀掉指定进程ID的进程

kill | Linux

  • 杀掉指定PID的进程
kill -9 <PID>
  • 批量杀掉指定关键字的进程
ps -ef | grep "java -cp" | grep -v grep | awk '{print $2}'  | xargs kill

ps -ef | grep ipython | grep -v grep | awk '{print $2}'  | xargs kill

taskkill | Windows

Windows OS中类似的命令 : tasklist 、taskkill

  • tasklist
C:\Users\Johnny>tasklist

映像名称                       PID 会话名              会话#       内存使用
========================= ======== ================ =========== ============
System Idle Process              0 Services                   0          8 K
System                           4 Services                   0      2,792 K
Registry                       120 Services                   0     55,760 K
smss.exe                       476 Services                   0        580 K
csrss.exe                      796 Services                   0      2,776 K
wininit.exe                    916 Services                   0      3,548 K
services.exe                   988 Services                   0      8,412 K
...
  • netstat
netstat -ano | findstr 8080
  • taskkill
taskkill -F -PID <PID>
taskkill -F -IM java.exe

根据端口,查找程序文件的运行/存放路径

方式1: /proc/PID | grep -i CWD

  • 先根据端口查出程序PID
# netstat -ntlp | grep 端口号 
  • 再根据PID查出程序所在文件路径
# ll /proc/PID | grep -i cwd

方式2: ss

# ss -lntp | grep 18163
LISTEN     0      128         :::18163                   :::*                   users:(("java",pid=87535,fd=296))

方式3: /proc/PID 【推荐】

cd /proc/<PID> & ls -ail | grep -i exe

方式4: lsof -p PID

lsof -p <PID>

查看指定进程(PID)的进程信息

  • init 进程是系统启动的第1个进程,进程的 PID1,也是系统中所有进程的父进程

进程状态(STAT)

-D:不可被唤醒的睡眠状态,通常用于 I/O 情况。
-R:该进程正在运行。
-S:该进程处于睡眠状态,可被唤醒。
-T:停止状态,可能是在后台暂停或进程处于除错状态。
-W:内存交互状态(从 2.6 内核开始无效)。
-X:死掉的进程(应该不会出现)。
-Z:僵尸进程。进程已经中止,但是部分程序还在内存当中。
-<:高优先级(以下状态在 BSD 格式中出现)。
-N:低优先级。
-L:被锁入内存。
-s:包含子进程。
-l:多线程(小写 L)。
-+:位于后台。

查看操作系统内各进程各自占用的句柄数

lsof -n|awk '{print $2}'|sort|uniq -c|sort -nr|more

显示所有进程信息

不同操作系统(如 Linux、BSD)的 ps 的版本和参数有很大差异,具体还是要以实际情况而定。

方式1: BSD格式输出

BSD格式: USER(用户名) , PID(进程ID) , PPID(父进程ID) , C , STIME , TTY , TIME , CMD

  UID:用户ID
  PID:process id 进程id
  PPID: parent process id 父进程id
  LWP:表示这是个线程;要么是主线程(进程),要么是线程
  NLWP: num of light weight process 轻量级进程数量,即线程数量
  STIME: start time 启动时间
  TIME: 占用的CPU总时间
  TTY:该进程是在哪个终端运行的;pts/0255代表虚拟终端,一般是远程连接的终端;tty1tty7 代表本地控制台终端
  CMD: 进程的启动命令

(输出的结果,PID可能重复)

  • -e 代表列出所有进程
  • -l 代表长格式
  • -f 代表完整的格式(有时候也用-F代表超完整的格式)
# ps -eLf

方式2: 标准格式输出

标准格式: USER , PID(进程ID) , %CPU , %MEM , VSZ , RSS , TTY , STAT , START , TIME , COMMAND
(输出的结果,PID升序罗列,且不会重复)

  • -a 表示所有关联到终端的进程,如果同时使用 x 则代表所有进程;
  • -u 表示列出进程的用户

(由于一些ps版本的原因,除了支持ps aux外,也支持了 ps -aux)

# ps -aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0 191136  3824 ?        Ss    2021   1:26 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root         2  0.0  0.0      0     0 ?        S     2021   0:00 [kthreadd]
root         4  0.0  0.0      0     0 ?        S<    2021   0:00 [kworker/0:0H]
root         6  0.0  0.0      0     0 ?        S     2021   0:29 [ksoftirqd/0]
root         7  0.0  0.0      0     0 ?        S     2021   0:22 [migration/0]
root         8  0.0  0.0      0     0 ?        S     2021   0:00 [rcu_bh]
root         9  0.0  0.0      0     0 ?        S     2021 136:52 [rcu_sched]
root        10  0.0  0.0      0     0 ?        S<    2021   0:00 [lru-add-drain]
root        11  0.0  0.0      0     0 ?        S     2021   1:16 [watchdog/0]
root        12  0.0  0.0      0     0 ?        S     2021   1:07 [watchdog/1]
root        13  0.0  0.0      0     0 ?        S     2021   0:28 [migration/1]
root        14  0.0  0.0      0     0 ?        S     2021   0:10 [ksoftirqd/1]
root        16  0.0  0.0      0     0 ?        S<    2021   0:00 [kworker/1:0H]
root        17  0.0  0.0      0     0 ?        S     2021   1:00 [watchdog/2]
root        18  0.0  0.0      0     0 ?        S     2021   0:10 [migration/2]
root        19  0.0  0.0      0     0 ?        S     2021   0:36 [ksoftirqd/2]
root        21  0.0  0.0      0     0 ?        S<    2021   0:00 [kworker/2:0H]
root        22  0.0  0.0      0     0 ?        S     2021   1:02 [watchdog/3]
root        23  0.0  0.0      0     0 ?        S     2021   0:26 [migration/3]
root        24  0.0  0.0      0     0 ?        S     2021   0:16 [ksoftirqd/3]
root        25  0.0  0.0      0     0 ?        S     2021   1:51 [kworker/3:0]
root        26  0.0  0.0      0     0 ?        S<    2021   0:00 [kworker/3:0H]
root        27  0.0  0.0      0     0 ?        S     2021   0:58 [watchdog/4]
root        28  0.0  0.0      0     0 ?        S     2021   0:07 [migration/4]
root        29  0.0  0.0      0     0 ?        S     2021   0:36 [ksoftirqd/4]
root        31  0.0  0.0      0     0 ?        S<    2021   0:00 [kworker/4:0H]
root        32  0.0  0.0      0     0 ?        S     2021   1:04 [watchdog/5]
root        33  0.0  0.0      0     0 ?        S     2021   0:29 [migration/5]
root        34  0.0  0.0      0     0 ?        S     2021   0:11 [ksoftirqd/5]
root        36  0.0  0.0      0     0 ?        S<    2021   0:00 [kworker/5:0H]
root        37  0.0  0.0      0     0 ?        S     2021   0:56 [watchdog/6]
root        38  0.0  0.0      0     0 ?        S     2021   0:07 [migration/6]
root        39  0.0  0.0      0     0 ?        S     2021   0:36 [ksoftirqd/6]
root        41  0.0  0.0      0     0 ?        S<    2021   0:00 [kworker/6:0H]
root        42  0.0  0.0      0     0 ?        S     2021   1:04 [watchdog/7]
root        43  0.0  0.0      0     0 ?        S     2021   0:30 [migration/7]
root        44  0.0  0.0      0     0 ?        S     2021   0:10 [ksoftirqd/7]
root        46  0.0  0.0      0     0 ?        S<    2021   0:00 [kworker/7:0H]
root        48  0.0  0.0      0     0 ?        S     2021   0:00 [kdevtmpfs]
root        49  0.0  0.0      0     0 ?        S<    2021   0:00 [netns]
root        50  0.0  0.0      0     0 ?        S     2021   6:21 [khungtaskd]
root        51  0.0  0.0      0     0 ?        S<    2021   0:00 [writeback]
root        52  0.0  0.0      0     0 ?        S<    2021   0:00 [kintegrityd]
root        53  0.0  0.0      0     0 ?        S<    2021   0:00 [bioset]
root        54  0.0  0.0      0     0 ?        S<    2021   0:00 [bioset]
root        55  0.0  0.0      0     0 ?        S<    2021   0:00 [bioset]
root        56  0.0  0.0      0     0 ?        S<    2021   0:00 [kblockd]
root        57  0.0  0.0      0     0 ?        S<    2021   0:00 [md]
root        58  0.0  0.0      0     0 ?        S<    2021   0:00 [edac-poller]
root        59  0.0  0.0      0     0 ?        S<    2021   0:00 [watchdogd]
root        60  0.0  0.0      0     0 ?        S     2021  11:15 [kworker/0:1]
root        61  0.0  0.0      0     0 ?        S     2021   0:44 [kworker/1:1]
root        66  0.0  0.0      0     0 ?        S     2021   0:34 [kswapd0]
root        67  0.0  0.0      0     0 ?        SN    2021   0:00 [ksmd]
root        68  0.0  0.0      0     0 ?        SN    2021   0:34 [khugepaged]
root        69  0.0  0.0      0     0 ?        S<    2021   0:00 [crypto]
root        77  0.0  0.0      0     0 ?        S<    2021   0:00 [kthrotld]
root        79  0.0  0.0      0     0 ?        S<    2021   0:00 [kmpath_rdacd]
root        80  0.0  0.0      0     0 ?        S<    2021   0:00 [kaluad]
root        81  0.0  0.0      0     0 ?        S<    2021   0:00 [kpsmoused]
root        83  0.0  0.0      0     0 ?        S<    2021   0:00 [ipv6_addrconf]
root        97  0.0  0.0      0     0 ?        S<    2021   0:00 [deferwq]
root       140  0.0  0.0      0     0 ?        S     2021   0:34 [kauditd]
root       144  0.0  0.0      0     0 ?        S     2021   5:03 [kworker/6:1]
root       256  0.0  0.0      0     0 ?        R     2021   6:21 [kworker/7:1]
root       339  0.0  0.0      0     0 ?        S<    2021   0:00 [ata_sff]
root       705  0.0  0.0      0     0 ?        S     2021   0:00 [scsi_eh_0]
root       707  0.0  0.0      0     0 ?        S<    2021   0:00 [scsi_tmf_0]
root       719  0.0  0.0      0     0 ?        S     2021   0:00 [scsi_eh_1]
root       724  0.0  0.0      0     0 ?        S<    2021   0:00 [scsi_tmf_1]
root       743  0.0  0.0      0     0 ?        S<    2021   0:00 [ttm_swap]
root       817  0.0  0.0      0     0 ?        S<    2021   0:03 [kworker/7:1H]
root       818  0.0  0.0      0     0 ?        S<    2021   1:54 [kworker/0:1H]
root       830  0.0  0.0      0     0 ?        S     2021  76:49 [jbd2/vda1-8]
root       831  0.0  0.0      0     0 ?        S<    2021   0:00 [ext4-rsv-conver]
root       892  0.0  0.0      0     0 ?        S<    2021   0:25 [kworker/2:1H]
root       900  0.0  0.0      0     0 ?        S<    2021   0:02 [kworker/3:1H]
root       918  0.0  0.0      0     0 ?        S<    2021   0:02 [kworker/5:1H]
root       919  0.0  0.0  48412 11632 ?        Ss    2021   2:18 /usr/lib/systemd/systemd-journald
root       922  0.0  0.0      0     0 ?        S<    2021  30:08 [kworker/6:1H]
root       930  0.0  0.0      0     0 ?        S<    2021   0:20 [kworker/1:1H]
root       948  0.0  0.0  45612  2412 ?        Ss    2021   0:00 /usr/lib/systemd/systemd-udevd
root       973  0.0  0.0      0     0 ?        S<    2021   0:20 [kworker/4:1H]
root      1340  0.0  0.0      0     0 ?        S<    2021   0:00 [nfit]
root      1543  0.0  0.0      0     0 ?        S     2021   3:52 [jbd2/vdb1-8]
root      1544  0.0  0.0      0     0 ?        S<    2021   0:00 [ext4-rsv-conver]
root      1570  0.0  0.0  55532  1048 ?        S<sl  2021   1:10 /sbin/auditd
root      1600  0.0  0.0  21664  1208 ?        Ss    2021  15:43 /usr/sbin/irqbalance --foreground
dbus      1601  0.0  0.0  58244  2272 ?        Ss    2021   0:20 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation
root      1605  0.0  0.0  26424  1744 ?        Ss    2021   0:21 /usr/lib/systemd/systemd-logind
polkitd   1607  0.0  0.0 612376 12376 ?        Ssl   2021   0:08 /usr/lib/polkit-1/polkitd --no-debug
ntp       1609  0.0  0.0  29960  2004 ?        Ss    2021   0:34 /usr/sbin/ntpd -u ntp:ntp -g
rabbitmq  1622  0.2  0.2 6055440 87260 ?       Ssl   2021 908:46 /usr/lib64/erlang/erts-8.0.3/bin/beam.smp -W w -A 128 -P 1048576 -t 5000000 -stbt db -zdbbl 128000 -K true -- -root /usr/lib64/erlang -progname erl -- -home /var/
root      1624  0.0  0.0 574328 16756 ?        Ssl   2021  32:09 /usr/bin/python2 -Es /usr/sbin/tuned -l -P
rabbitmq  1899  0.0  0.0  13608  2432 ?        S     2021   3:08 /usr/lib64/erlang/erts-8.0.3/bin/epmd -daemon
mysql     1939 21.2  4.9 6882464 1617448 ?     Sl    2021 88789:57 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid
root      1940  0.0  0.0  90176  2188 ?        Ss    2021   1:00 /usr/libexec/postfix/master -w
postfix   1973  0.0  0.0  90456  3560 ?        S     2021   0:12 qmgr -l -t unix -u
root      1983  0.0  0.0 494340  8752 ?        Ssl   2021  13:46 /usr/sbin/rsyslogd -n
root      2234  0.1  0.0 153988  6992 ?        Ssl   2021 420:07 /usr/local/bin/redis-server 0.0.0.0:6379
root      2273  0.0  0.0 102900  5520 ?        S    1月13   0:00 /sbin/dhclient -d -q -sf /usr/libexec/nm-dhcp-helper -pf /var/run/dhclient-eth0.pid -lf /var/lib/NetworkManager/dhclient-5fb06bd0-0bb0-7ffb-45f1-d6edd65f3e03-eth
root      2289  0.4  3.4 10092176 1135124 ?    Sl   10:30   3:03 /opt/jdk1.8.0_102/bin/java -Djava.util.logging.config.file=/opt/govern/datasource/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderL
rabbitmq  2472  0.0  0.0   4356   524 ?        Ss    2021   6:43 erl_child_setup 1024
root      2757  0.0  0.0 112924  3932 ?        Ss    2021   4:02 /usr/sbin/sshd -D
root      2760  0.0  0.0  25908   932 ?        Ss    2021   0:00 /usr/sbin/atd -f
root      2762  0.0  0.0 126388  1624 ?        Ss    2021   0:20 /usr/sbin/crond -n
root      2768  0.0  0.0 548004  8620 ?        Ssl  1月13   0:01 /usr/sbin/NetworkManager --no-daemon
root      2816  0.0  0.0      0     0 ?        S    1月08   0:05 [kworker/2:0]
rabbitmq  2850  0.0  0.0  11592   444 ?        Ss    2021   0:29 inet_gethost 4
rabbitmq  2851  0.0  0.0  13716   700 ?        S     2021   0:40 inet_gethost 4
root      2864  0.0  0.0  51128  1892 ?        Ss    2021  44:42 /usr/local/hostguard/bin/hostguard -l /usr/local/hostguard/log
root      3118  0.0  0.0  46608  1268 ?        Ss    2021   0:00 nginx: master process nginx
nginx     3119  0.0  0.0  47084  2572 ?        S     2021   2:06 nginx: worker process
root      3341  0.4 10.3 8687412 3390992 ?     Sl    2021 1985:09 /opt/jdk1.8.0_102/bin/java -Djava.util.logging.config.file=/opt/govern/wydataeye/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderL
root      3515  0.1  0.0 1396608 12044 ?       Sl   1月05  25:52 /usr/local/hostguard/bin/hostguard -l /usr/local/hostguard/log
root      3636  0.1  3.4 8052700 1134900 ?     Sl    2021 469:33 /opt/jdk1.8.0_102/bin/java -Djava.util.logging.config.file=/opt/govern/cas/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManag
root      3815  0.2  3.5 7958108 1162612 ?     Sl    2021 854:34 /opt/jdk1.8.0_102/bin/java -Djava.util.logging.config.file=/opt/govern/wydaas/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogMa
root      3918  0.1  4.1 8053700 1348288 ?     Sl    2021 703:14 /opt/jdk1.8.0_102/bin/java -Djava.util.logging.config.file=/opt/govern/wydataquality/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoad
root      4041  3.1  7.8 8017936 2584252 ?     Sl    2021 13100:34 /opt/jdk1.8.0_102/bin/java -Djava.util.logging.config.file=/opt/govern/wytaskwatcher/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLo
root      4153  0.0  0.0      0     0 ?        S    1月07   0:37 [kworker/5:1]
root      4497  0.0  0.0      0     0 ?        S    10:53   0:00 [kworker/u16:2]
root      5117  0.0  0.0      0     0 ?        S     2021   0:00 [kworker/2:2]
postfix   5976  0.0  0.0  90280  4212 ?        S    19:47   0:00 pickup -l -t unix -u
root      6040  0.0  0.0 155560  6332 ?        Ds   20:27   0:00 sshd: root@pts/0
root      6042  0.0  0.0 116052  2568 pts/0    Ss   20:27   0:00 -bash
root      6094  0.0  0.0 155472  1872 pts/0    R+   20:53   0:00 ps -aux
root      8199  0.0  0.0      0     0 ?        S     2021   0:00 [kworker/7:2]
root      9147  0.4  3.6 7954932 1204068 ?     Sl    2021 577:09 /opt/jdk1.8.0_102/bin/java -Djava.util.logging.config.file=/opt/govern/bms/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManag
root      9779  0.0  0.0      0     0 ?        S     2021   0:00 [kworker/4:1]
root     12889  0.0  0.0      0     0 ?        S     2021   1:26 [kworker/4:0]
root     13231  0.0  0.0      0     0 ?        S     2021   4:35 [kworker/5:0]
root     14010  0.0  0.0      0     0 ?        S     2021   0:05 [kworker/u16:1]
root     22232  0.0  0.0      0     0 ?        S     2021   1:08 [kworker/1:0]
root     22574  0.0  0.0      0     0 ?        S     2021   0:00 [kworker/0:2]
root     26917  0.0  0.0 116136  2752 tty1     Ss+  1月13   0:01 -bash
root     27291  0.0  0.0  97144  2672 ?        Ss   1月12   0:00 login -- root
root     29514  0.0  0.0      0     0 ?        S     2021   0:00 [kworker/3:2]
root     30703  0.0  0.0      0     0 ?        S     2021   0:00 [kworker/6:0]

以树形结构显示【程序】和【进程】之间的关系:pstree

命令格式

pstree [选项] [PID或用户名]

命令参数

选项 含义
-a 显示启动每个进程对应的完整指令,包括启动进程的路径、参数等。
-c 不使用精简法显示进程信息,即显示的进程中包含子进程和父进程。
-n 根据进程 PID 号来排序输出,默认是以程序名排序输出的。
-p 显示进程的 PID。
-u 显示进程对应的用户名称。

在使用 pstree 命令时,如果不指定进程的 PID 号,也不指定用户名称,则会以 init 进程为根进程,显示系统中所有程序和进程的信息;反之,若指定 PID 号或用户名,则将以 PID 或指定命令为根进程,显示 PID 或用户对应的所有程序和进程。

查看指定进程的进程树

# pstree -p 2289
java(2289)-+-{java}(2290)
           |-{java}(2291)
           |-{java}(2292)
           |-{java}(2293)
           |-{java}(2294)
           |-{java}(2295)
           |-{java}(2296)
           |-{java}(2297)
           |-{java}(2298)
           |-{java}(2299)
           |-{java}(2300)
           |-{java}(2301)
           |-{java}(2302)
...

# pstree
[root@gly-deploy-07 ~]# pstree
systemd─┬─NetworkManager─┬─dhclient
        │                └─2*[{NetworkManager}]
        ├─atd
        ├─auditd───{auditd}
        ├─beam.smp─┬─erl_child_setup───inet_gethost───inet_gethost
        │          └─139*[{beam.smp}]
        ├─crond
        ├─dbus-daemon
        ├─epmd
        ├─hostguard───hostguard───18*[{hostguard}]
        ├─irqbalance
        ├─java───2149*[{java}]
        ├─java───182*[{java}]
        ├─java───170*[{java}]
        ├─java───80*[{java}]
        ├─java───75*[{java}]
        ├─java───107*[{java}]
        ├─java───71*[{java}]
        ├─login───bash
        ├─master─┬─pickup
        │        └─qmgr
        ├─mysqld───70*[{mysqld}]
        ├─nginx───nginx
        ├─ntpd
        ├─polkitd───6*[{polkitd}]
        ├─redis-server───3*[{redis-server}]
        ├─rsyslogd───2*[{rsyslogd}]
        ├─sshd───sshd───bash───pstree
        ├─systemd-journal
        ├─systemd-logind
        ├─systemd-udevd
        └─tuned───4*[{tuned}]

查看【指定用户】启动的进程树

# pstree mysql
mysqld───70*[{mysqld}]
(显示了 mysql 用户启动了1个进程【mysqld】,并且 mysqld 进程拥有 69 个子进程(外加 1 个父进程,共计 70 个进程)。)

# pstree root
systemd─┬─NetworkManager─┬─dhclient
        │                └─2*[{NetworkManager}]
        ├─atd
        ├─auditd───{auditd}
        ├─beam.smp─┬─erl_child_setup───inet_gethost───inet_gethost
        │          └─139*[{beam.smp}]
        ├─crond
        ├─dbus-daemon
        ├─epmd
        ├─hostguard───hostguard───18*[{hostguard}]
        ├─irqbalance
        ├─java───2153*[{java}]
        ├─java───182*[{java}]
        ├─java───170*[{java}]
        ├─java───80*[{java}]
        ├─java───75*[{java}]
        ├─java───107*[{java}]
        ├─java───71*[{java}]
        ├─login───bash
        ├─master─┬─pickup
        │        └─qmgr
        ├─mysqld───70*[{mysqld}]
        ├─nginx───nginx
        ├─ntpd
        ├─polkitd───6*[{polkitd}]
        ├─redis-server───3*[{redis-server}]
        ├─rsyslogd───2*[{rsyslogd}]
        ├─sshd───sshd───bash───pstree
        ├─systemd-journal
        ├─systemd-logind
        ├─systemd-udevd
        └─tuned───4*[{tuned}]

# pstree nginx
nginx

查看指定进程(PID)的全部【进程】信息

# ll /proc/2289/

查看指定进程ID(PID)的线程信息

查看指定进程(PID)的全部【线程】信息

# ll /proc/2289/task/
dr-xr-xr-x 7 root root 0 1月  14 20:28 5952
dr-xr-xr-x 7 root root 0 1月  14 20:28 5953
dr-xr-xr-x 7 root root 0 1月  14 20:28 5954
dr-xr-xr-x 7 root root 0 1月  14 20:28 5955
dr-xr-xr-x 7 root root 0 1月  14 20:28 5980
dr-xr-xr-x 7 root root 0 1月  14 20:28 5981
dr-xr-xr-x 7 root root 0 1月  14 20:28 5982
dr-xr-xr-x 7 root root 0 1月  14 20:28 5983
...
# ll /proc/<process-id>/task/<thread-id>

统计指定进程(PID)的线程数

方式1 /proc/

# ll /proc/2289/task/ | wc -l

方式2 pstree

# pstree -p <PID>|wc -l
2153

【kill】命令

命令简述

应用场景

kill -0 {pid} : 根据PID检查目标进程是否存在

  • kill -0 {pid} 不发送任何信号,不会结束进程,但是系统会进行错误检查
# ps -ef | grep -i python
root       578     1  0 Aug30 ?        00:03:58 /usr/bin/python2 -Es /usr/sbin/tuned -l -P
root     21798 15338  0 19:35 pts/0    00:00:00 grep --color=auto -i python

# kill -0 578
# kill -0 1
(均没有回应,说明有对应进程)

# kill -0 5578
-bash: kill: (5578) - No such process
(有回应,对应进程不存在)
  • 经常用来检查一个进程是否存在,存在返回0不存在返回1
  • vim check_process.sh
#!/bin/bash

# 检查给定的 PID 是否存在的函数
check_pid() {
    local pid=$1
    if kill -0 "$pid" 2>/dev/null; then
        echo "进程 $pid 存在"
        return 0
    else
        echo "进程 $pid 不存在"
        return 1
    fi
}

check_pid $1
  • use
root@ecs-xxx:~# sh check_process.sh 1590806
进程 1590806 存在
root@ecs-xxx:~# sh check_process.sh 159
进程 159 不存在
  • 扩展:安全地清理指定PID的进程
  • vim clean_proc.sh
#!/bin/bash
 
pid=$1  # 传入要清理的进程ID
 
# 检查进程是否存在
if kill -0 $pid 2>/dev/null; then
    echo "进程 $pid 正在运行,不能清理。"
else # step1 确认进程ID不是当前正在运行的进程
    echo "清理 /proc/$pid 目录中的文件..."
    # step2 使用rm命令删除/proc/pid目录下所有文件
    rm -rf /proc/$pid/*
fi

./clean_proc.sh 1234

推荐文献

kill -15 {pid}

  • 执行完该指令后,操作系统会发送一个 SIGTERM 信号给对应的程序。当程序接收到该信号后,可能会发生以下几种情况的一种:
  • 当前程序立刻停止;
  • 程序释放相应资源,然后再停止;
  • 程序可能仍然继续运行。

大部分程序会先释放自己的资源,然后再停止。
但是也有程序可以在接受到信号量后,继续做其他一些事情,并且这些事情是可以配置的。
如果程序正在等待IO,可能就不会立马做出响应,也就是说,SIGTERM 是可能被阻塞、被忽略的。

kill -9 {pid}

  • 如果 kill -15 发出的SIGTERM可以不进行响应,那么kill -9发出的SIGKILL就是必杀信号,多半 ROOT 会直接使用这个命令。

建议:在使用 kill -9 前,应该先使用 kill -15,给目标进程一个清理善后工作的机会。如果没有,可能会留下一些不完整的文件或状态,从而影响服务的再次启动。

推荐文献

posted @ 2020-08-05 10:08  千千寰宇  阅读(1611)  评论(0编辑  收藏  举报