[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个进程,进程的PID
是1
,也是系统中所有进程的父进程
进程状态(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,给目标进程一个清理善后工作的机会。如果没有,可能会留下一些不完整的文件或状态,从而影响服务的再次启动。
推荐文献
本文链接: https://www.cnblogs.com/johnnyzen
关于博文:评论和私信会在第一时间回复,或直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
日常交流:大数据与软件开发-QQ交流群: 774386015 【入群二维码】参见左下角。您的支持、鼓励是博主技术写作的重要动力!