目录
查看进程
进程状态 (了解)
TTY (拓展)
查看进程PID
1. pgrep
2. pidof
动态查看查看进程
top与htop的操作:
计算cpu负载:
进程控制
kill与pkill
查看端口
1. netstat
2. ss
3. lsof
查看进程
ps :process nsapashot命令在Unix基础的系统中,被广泛用来查看当前系统的进程状态。这个命令有许多参数,其中一些常用的参数如下:
-e
:列出所有进程。-f
:全格式输出。-l
:长格式输出。-a
:显示终端上的所有进程,包括其他用户的进程。-u
:用户为有效用户的进程。-x
:显示没有控制终端的进程。-p
:随后可以指定进程ID,显示该ID的进程的状态。-T
:显示各个线程的状态。-o
:自定义输出格式。
因此,常见的几种 ps
组合参数包括(黑体加粗的是最常用):
ps -e
:显示所有进程。ps -ef
:以全格式显示所有进程。ps -aux
:显示包括其他用户在内的所有进程,并包含每个进程的CPU使用率、内存使用率、启动时间等详细信息。ps -l
:长格式输出,包括进程状态、UID、GID等详细信息。ps -p
:查看指定PID的进程的状态。
[root@localhost ~]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
============================================================================
USER: #运行进程的用户
PID: #进程ID
%CPU: #CPU占用率
%MEM: #内存占用率
VSZ 进程占用的虚拟内存大小。
RSS 占用的物理内存大小
STAT: #进程状态 ---了解
? 表示没有占用终端
R 运行
S 可中断睡眠 Sleep
D 不可中断睡眠
T 停止的进程
Z 僵尸进程
X 死掉的进程
START: #进程的启动时间
TIME: #进程占用CPU的总时间
COMMAND: #进程文件,进程名
[root@localhost ~]# ps -ef
UID PID PPID C STIME TTY TIME CMD
=============================================================
UID 用户ID
PID 进程ID
PPID 父进程ID
C CPU占用率
STIME 开始时间
TTY 开始此进程的TTY----终端设备
TIME 此进程运行的总时间
CMD 命令名
进程状态 (了解)
R:运行(running)或可运行(runnable)(在运行队列中)
S:中断(interruptable sleep),等待某个条件结束
D:不可中断(uninterruptable sleep),通常是进行I/O操作
T:停止(stoppped),可能被作业控制或因为被追踪(traced)
Z:僵尸(zombie)状态,进程已经终止,但父进程尚未获取其终止状态
X:进程不存在
I:空闲(idle)状态
W:换页(paging )
<:高优先级(high-priority )
N:低优先级(low-priority)
L:内存泄漏(leaky:pages locked into memory)
s:进程领导者(session leader)
l:多线程(multi-threaded)
+:前台进程组(foreground process group)
Sl:此进程是多线程的,通常表示它是一个服务进程
Ss:此进程是当前会话的领导者
R+:此进程处于前台进程组
S<:此进程的优先级较高
SN:此进程的优先级较低
TTY (拓展)
在Unix和Unix-like操作系统中,TTY是Teletypewriter的缩写,指的是终端。最早,TTY是指打字机式打印设备,是人类与计算机交互的最早设备。随着技术的进步,现在的终端设备已经从打字机式的设备发展为电子显示屏和键盘。
在Linux系统中,每一个登录的用户都会被分配一个终端(TTY)。这个终端可能是一个实体的控制台、或者是一个远程的终端、或者是伪终端(例如SSH进入系统得到的终端,或者是图形界面打开的终端模拟器所得到的终端)。
通过 who
命令查看当前系统中所有已登录用户使用的终端,也可以通过 tty
命令查看当前操作使用的是哪个终端,如果有多个终端连接系统,w命令可以显示全部并将当前终端用w标识。
[root@localhost ~]# w
15:46:23 up 2:01, 1 user, load average: 0.00, 0.01, 0.01
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 192.168.226.1 13:45 7.00s 0.03s 0.00s w
[root@localhost ~]# who
root pts/0 2024-04-28 13:45 (192.168.226.1)
[root@localhost ~]# tty
/dev/pts/0
查看进程PID
1. pgrep
pgrep
命令用于查找符合指定条件的进程,并将找到的进程的进程ID输出到标准输出。这个命令有很多选项,可以按名称、用户、进程组等条件搜索进程。pgrep
命令更强大,可以通过进程名称、用户UID、终端等各种参数来匹配进程。
例如,pgrep sshd
命令会找到名为"sshd"的所有进程的PID。
[root@localhost ~]# pgrep sshd
889
1143
1150
2. pidof
pidof
命令用于查找具有特定名字的进程的进程ID,它是killall
和pkill
命令的低级版本。
例如, pidof sshd
命令会找到名为"sshd"的进程的PID。
[root@localhost ~]# pidof sshd
1150 1143 889
动态查看查看进程
[root@localhost ~]# top #动态显示信息,三秒刷新一次。
或
[root@localhost ~]# yum install -y htop
[root@localhost ~]# htop #top的升级版
top和htop都是Linux系统中用于动态观察系统和进程状态的实用工具,但两者之间存在一些差异。
top:
top命令可以动态观察系统状态,包括查看CPU使用情况、内存使用情况、运行的进程等信息。top 是一个非常常用的命令,几乎所有的Linux发行版都会内置。它提供了实时的视图来显示正在运行的系统上哪些进程占用了最多的CPU。
htop:
htop 是 top 的一个增强版。与top相比,htop提供了一个颜色丰富,更易于阅读和理解的界面。除了可以显示基本的系统状态和进程信息,htop 还可以直接对进程进行管理,比如结束进程等。
在htop中,有一些额外的功能,例如:
显示所有CPU的负载图。(在多核CPU中非常有用)
更好的内存使用显示。
滚动查看和管理所有进程。
可以直接操作进程,例如结束进程,而无需知道进程ID。
top - 19:46:13 up 6:01, 1 user, load average: 0.00, 0.01, 0.04
Tasks: 107 total, 1 running, 104 sleeping, 2 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 995676 total, 521300 free, 164960 used, 309416 buff/cache
KiB Swap: 2097148 total, 2097148 free, 0 used. 682392 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 125512 4060 2620 S 0.0 0.4 0:00.79 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
4 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
6 root 20 0 0 0 0 S 0.0 0.0 0:00.11 ksoftirqd/0
7 root rt 0 0 0 0 S 0.0 0.0 0:00.00 migration/0
8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh
9 root 20 0 0 0 0 S 0.0 0.0 0:00.25 rcu_sched
10 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 lru-add-drain
11 root rt 0 0 0 0 S 0.0 0.0 0:00.13 watchdog/0
13 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kdevtmpfs
14 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 netns
15 root 20 0 0 0 0 S 0.0 0.0 0:00.01 khungtaskd
16 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 writeback
17 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kintegrityd
18 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 bioset
us: 用户模式 (user time),花在用户模式进程上的CPU时钟时间百分比。
sy: 系统模式 (system time),花在内核模式进程上的CPU时钟时间百分比。
ni: 用户模式的 nice 权重(调整过优先级)的进程的CPU时钟时间百分比。
id: 空闲时间 (idle time),CPU空闲的时间百分比。
wa: I/O等待 (iowait),由于等待I/O操作(例如读写硬盘)而空闲的CPU时钟时间百分比。
hi: 硬中断时间 (hardware irq),处理硬中断请求(hardware IRQ)的CPU时钟时间百分比。
si: 软中断时间 (software irq),处理软中断请求(software IRQ)的CPU时钟时间百分比。
st: 用在虚拟机环境,表示被hypervisor偷走的时间。
进程优先级 nice :
nice 值越高:表示优先级越低,例如+19,该进程容易将CPU 使用量让给其他进程。
nice 值越低:表示优先级越高,例如-20,该进程更不倾向于让出CPU。
修改进程优先级(了解)
renice
-n:设置新的优先级值
-p:后接进程ID (PID)
-g:后接进程组 ID
-u:后接用户名或者用户ID
例:
#对 PID 为 1234 的进程设置新的 nice 值 10
renice -n 10 -p 1234
#将用户名为 'username' 所有进程的优先级都提高 5
renice -n -5 -u username
#对进程组ID为 456 的进程组设置新的 nice 值 5
renice -n 5 -g 456
PID: Process ID,就是进程的ID号。
USER: 进程的拥有者。
PR: Priority,进程的优先级状态,越小越优先被执行。
NI: Nice value,一个值,用来设定进程被调度的优先级;
VIRT: Virtual Memory Usage,进程用掉的虚拟内存总量,包含了进程使用的库、代码、数据等。
RES: Resident Memory Usage,驻留内存大小,即进程使用的物理内存大小。
SHR: Shared Memory Size,共享内存大小,即该进程使用的可共享的内存大小。
S: 进程状态。包括:'D' 不可中断的睡眠状态,'R' 运行中,'S' 睡眠状态,'T' 被跟踪或已停止,'Z' 僵尸进程。
%CPU: 进程占用CPU的使用率。
%MEM: 进程使用的物理内存和总物理内存的百分比。
TIME+: 该进程启动后占用的总的CPU时间。
COMMAND: 进程启动命令名称。
top与htop的操作:
> 往下翻页
< 往上翻页
q 退出
z 彩色显示
W 保存
排序:
在top运行时,你可以通过按相应的按键来改变进程列表的排序方式。比如以下几个常用的键:
P
: 以CPU使用率排序。
M
: 以内存使用率排序。
T
: 以运行时间排序。
刷新频率:
默认情况下,top每3秒刷新一次。你可以通过按s
键,然后输入一个新的数字来改变刷新的频率。例如,按s
,然后输入1
, top就会每秒刷新一次。
在工作中必须监控的东西 load average(平均负载)等待cpu处理的队列长度也是个数。
1分钟 第一个数字
5分钟 第二个数字
15分钟 第三个数字
计算cpu负载:
load average的三个值: 0.10, 0.16, 0.12,分别除cpu的个数,得出的值,如果值大于1那么那时候的负载高。
进程控制
kill与pkill
[root@localhost ~]# kill -l #查看所有信号
#在显示的64个信号中,总结来讲只需要记住五个即可
-1 HUP 重新加载进程或者重新加载配置文件,PID不变
-9 KILL 强制杀死
-15 TERM 正常杀死(这个信号可以默认不写)
-18 CONT 激活进程
-19 STOP 挂起进程
例:
kill -1 59363 #发送重启信号,例如vsftpd的配置文件发生改变,希望重新加载
kill 59363 #正常杀死进程,信号为-15可以默认不写。
kill -9 67003 #强制杀死,一般用于不能正常停止的情况下
pkill -9 vsftpd #使用pkill可以指定进程名字
kill 和 pkill 的主要区别在于:
kill 需要明确的进程ID,而 pkill 可以通过进程的其他属性(如名字)来指定目标进程。pkill使用服务名的时候会杀死所有包含服务名的服务。
查看端口
1. netstat
使用前提是需要有net-tools包才可使用。
-
-a
: 显示所有连接和侦听端口。 -
-n
: 显示数字格式的地址和端口号,而不是尝试查找并显示名称。 -
-t
: 显示TCP连接。 -
-u
: 显示UDP连接。 -
-l
: 仅显示在侦听状态的套接字(即正在等待连接的服务器端的套接字) -
-p
: 显示与套接字关联的进程ID和名称。 -
-r
: 显示路由表。 -
-i
: 显示网络接口信息。 -
-e
: 参数可以显示更多关于网络接口的详细信息 -
-s
: 显示网络统计信息,如IP, TCP, UDP等协议的统计信息。
例:可以将多个参数一起使用如果你想看所有的TCP连接,并且你希望看到数字格式的地址和端口号,你可以使用
netstat -nt
如果你想知道哪个进程正在使用某个端口,你可以使用
netstat -anp
如果你想要同时查看TCP和UDP连接,你可以使用
netstat -tu
2. ss
ss的参数一样可用netstat的参数使用。ss -tnlp 常用组合命令
例:
显示所有打开的网络连接:
ss
如果你想看到数字形式的端口和地址,而不是尝试获取名称,你可以使用-n
参数:
ss -tun
显示系统中所有监听的 TCP 套接字以及关联的进程信息
ss -tnlp
3. lsof
前提需要有lsof包才可使用。
-a
:该参数用于连接参数和表达式条件,可以理解为“与”的逻辑。-c
:后接进程名,表示列出该进程所打开的文件。-p
:后接进程ID,表示列出该进程ID所打开的文件。-u
:后接用户名,表示列出该用户进程打开的文件。-i
:该参数后面可以跟网络协议(如 TCP 或 UDP)、端口号等,用来显示网络连接情况。-d
:后接文件描述符,用于显示该描述符的进程。-n
:此参数让 lsof 显示网络连接的数字IP地址。-P
:此参数让 lsof 显示数字形式的端口号。-t
:此参数让 lsof 仅打印进程 ID ,常用于 shell 脚本。
例:
查看用户 nginx 打开的所有文件:
lsof -u nginx
列出 PID 为 123 的进程所有打开的文件:
lsof -p 123
列出所有监听 TCP 或 UDP 端口的进程:
lsof -i tcp,udp
列出所有由 root 打开的网络连接:
lsof -u root -i
列出所有80端口的HTTP连接:
lsof -i tcp:80
列出所有端口为22的网络连接:
lsof -i :22