监控和管理Linux进程
理解Linux进程
1.进程
进程是操作系统进行资源分配和调度的基本单位。当一个程序被启动时,操作系统会为它创建一个进程,分配必要的资源(如内存、文件描述符等),并调度它在 CPU 上执行。
- 创建:程序启动时,操作系统创建一个进程,分配资源。
- 调度:操作系统调度器决定哪个进程应该运行。
- 执行:进程在 CPU 上执行。
- 终止:进程完成后,操作系统释放资源。
2.线程
进程和线程的区别
- 资源分配:
进程拥有独立的地址空间和系统资源。
线程共享进程的地址空间和资源。 - 调度:
进程由操作系统调度器独立调度。
线程在同一进程内共享资源,由线程调度器调度。 - 通信:
进程间通信(IPC)较为复杂,需要特殊机制。
线程间通信更简单,直接共享内存。 - 开销:
创建和销毁进程的开销较大。
创建和销毁线程的开销较小。
3.进程的常见状态
R(Running or Runnable)
运行状态,表示进程正在运行或在运行队列中等待。当进程获得CPU资源时,它处于此状态。例如,当一个程序被调度执行时,它就进入了运行态。
S(Sleeping)
进程已具备运行条件,但因无空闲CPU而暂时不能运行,等待CPU分配时间片。当进程调度器为其分配CPU时,它将进入运行态。例如,程序调用printf涉及底层写操作,可能因输出设备速度慢导致进程进入S状态等待。
D(Disk Sleep)
阻塞态,也叫磁盘休眠状态或不可中断睡眠状态。进程在此状态下等待I/O操作完成,如等待磁盘读写。它不会响应异步信号,只有特定硬件条件满足时才会被唤醒,通常持续时间较短。
t(Tracing stop)
跟踪暂停状态,是在使用跟踪工具对进程进行跟踪时进程所处的状态。进程会被暂停等待调试器的下一个信号来执行具体的操作,便于调试或监控。
T(Stopped)
停止状态,可以通过发送SIGSTOP信号给进程来停止该进程。这个被暂停的进程可以通过发送SIGCONT信号让进程继续运行。
Z(Zombie)
僵尸状态,是一个比较特殊的状态。当进程退出并且父进程没有读取到子进程退出的返回代码时就会产生僵尸进程。僵尸进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。如果父进程一直都不去读取子进程状态,那么子进程就会一直处于僵尸状态,这会造成系统资源的浪费,如内存泄漏等问题。
X(Dead)
死亡状态,进程已终止,从进程列表中移除。不过在某些情况下,可能会短暂出现这种状态标识。
监控Linux进程
1.ps命令
使用 ps
命令查看进程快照。
ps -ef
[user@host ~]$ ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 09:00 ? 00:00:01 /sbin/init
root 2 0 0 09:00 ? 00:00:00 [kthreadd]
root 3 2 0 09:00 ? 00:00:00 [ksoftirqd/0]
root 1234 1233 0 10:30 pts/1 00:00:00 bash
user 5678 1234 0 11:15 pts/1 00:00:00 python script.py
UID:进程所有者用户ID
PID:进程唯一标识符
PPID:父进程ID
C:CPU使用率(百分比)
STIME:启动时间
TTY:关联终端(?表示无终端)
TIME:累计CPU时间
CMD:启动命令
ps aux
[user@host ~]$ ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 22528 4104 ? Ss 09:00 0:01 /sbin/init
root 2 0.0 0.0 0 0 ? S 09:00 0:00 [kthreadd]
user 5678 0.5 1.2 4504040 164896 ? Ssl 11:15 0:24 python script.py
%CPU:CPU占用率
%MEM:内存占用率
VSZ:虚拟内存大小(KB)
RSS:物理内存占用(KB)
STAT:进程状态(如 Ssl 表示睡眠、多线程、会话领导)
ps lax
[user@host ~]$ ps -lax
F S UID PID PPID PPRI NI VSZS %CPU TIME+ COMMAND
4 S+ 1000 1 0 -2 0 0.0 0:00.00 init [systemd]
5 S+ 1000 2 0 -2 0 0.0 0:00.00 kthreadd
6 R+ 1000 3 0 -2 0 0.0 0:00.00 [kworker]
7 S 1000 4 0 -2 0 0.0 0:00.00 (sd-pAM)
8 S 1000 5 0 -2 0 0.0 0:00.00 ksoftirqd/0
9 S 1000 6 0 -2 0 0.0 0:00.00 khelper
F:Flag(标志),显示进程的控制终端类型(4 表示前台进程 S 表示会话领进程(session leader) + 表示进程在前台运行。)
S:Status(状态),显示进程的当前状态
PRI:Priority(优先级),进程的优先级数值。数值越小,优先级越高
NI:Nice 值,进程的相对优先级。数值越小,优先级越高
VSZ:虚拟内存大小,进程使用的虚拟内存总量
VSZ:常驻内存大小,进程使用的物理内存总量
RSS:Resident Set Size,进程实际使用的物理内存大小
TIME+:显示进程启动以来的 CPU 使用时间
COMMAND:命令名称/参数,显示启动该进程的命令和参数
2.top命令
使用 top
命令,实时系统监视工具,它能够显示系统中各个进程的资源占用情况。(若在前台执行该命令,它将独占前台,直到用户终止该程序,按 q 键退出)
top - 14:25:30 up 12 days, 5:36, 3 users, load average: 0.12, 0.08, 0.05
Tasks: 287 total, 1 running, 286 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.3 us, 0.2 sy, 0.0 ni, 99.5 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 16226.0 total, 8666.4 free, 7335.6 used, 224.0 buff/cache
MiB Swap: 49152.0 total, 48408.7 free, 743.3 used. 8759.8 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1234 user1 20 0 1234m 123m 123m S 1.0 1.5 0:01.23 process1
5678 user2 20 0 2345m 234m 234m S 0.5 2.9 0:02.34 process2
PID:进程 ID。
USER:进程所有者。
PR:进程优先级。
NI:进程的 nice 值。
VIRT:进程的虚拟内存大小。
RES:进程使用的物理内存大小。
SHR:共享内存大小。
S:进程状态(例如,R=运行,S=睡眠)。
%CPU:进程使用的 CPU 百分比。
%MEM:进程使用的物理内存百分比。
TIME+:进程使用的 CPU 时间总计。
管理Linux进程
1.启动和停止进程
(1)基础启动方式
直接使用命令
sleep 1000
后台运行进程,避免阻塞终端
command &
使用 nohup 命令启动,nohup 命令可将进程与当前终端会话分离,使其在后台持续运行,即使终端会话结束,进程也不会终止
nohup command &
(2)服务管理方式
创建服务文件:创建一个以 .service 为后缀的服务文件,例如 example.service。可以使用文本编辑器(如 nano 或 vim)创建该文件。
[Unit]
Description=My Example Service
After=network.target
[Service]
ExecStart=/usr/bin/example
Restart=always
[Install]
WantedBy=multi-user.target
##[Unit] 部分描述了服务的基本信息和依赖关系;
##[Service] 部分指定了服务的启动命令和重启策略;
##[Install] 部分用于设置服务的安装目标。
放置服务文件:将创建好的服务文件放置在 /etc/systemd/system 目录下。
启动服务:使用以下命令启动服务:
sudo systemctl start example.service
sudo systemctl status example.service
(3)其他启动方式
使用脚本文件启动
创建脚本文件:
使用文本编辑器(如 nano)创建一个新的文件,例如 start.sh:
nano start.sh
#!/bin/bash
echo
2.信号发送
信号机制是一种用于进程间通信的方式。信号可以由内核发送,也可以由用户通过程序发送。信号可以触发进程执行特定的操作,如终止、暂停或继续执行。
- 信号类型:信号分为两类,一类是同步信号,另一类是异步信号。同步信号通常用于通知进程发生了某种事件,而异步信号则用于请求进程执行特定的操作。
- 信号处理:进程可以对信号进行处理,有以下几种处理方式:
- 忽略:进程可以选择忽略某些信号。
- 捕获捕:进程可以捕获信号,并执行相应的处理函数。
- 默认:进程可以不指定处理信号的处理方式,此时将采用系统默认的处理方式。
- 信号发送:信号可以通过 kill 命令发送,也可以在程序中通过 raise 函数发送。
常见信号:
SIGKILL (Signal 6):
发送一个非法指令给进程。
SIGABRT (Signal 6):
程序异常终止,通常用于捕捉到程序错误时。
SIGFPE (Signal 8):
浮点异常,比如除以0。
SIGALRM (Signal 14):
系统时钟定时器超时。
SIGTERM (Signal 15):
终止进程,这是默认的终止信号,通常用于优雅地关闭进程。
SIGSTOP (Signal 17):
停止进程,进程会暂停执行,直到收到 SIGCONT 信号。
SIGCONT (Signal 18):
继续执行,用于恢复被 SIGSTOP 信号暂停的进程。
SIGCHLD (Signal 17):
子进程状态改变,通知父进程子进程状态的改变。
SIGINT (Signal 2):
程序终止(Interrupt),通常由用户通过 Ctrl+C 发送。
SIGQUIT (Signal 3):
退出,请求进程退出,并生成核心转储文件。
SIGUSR1 和 SIGUSR2 (Signals 10 和 12):
用户自定义信号,可以用于应用程序的特定逻辑。
SIGWINCH (Signal 28):
窗口大小改变,当终端窗口大小改变时发送。
可以使用 kill 命令来发送信号给进程
发送默认终止信号(SIGTERM)
kill PID
强制终止进程(SIGKILL)
kill -9 PID
暂停进程(SIGSTOP)
kill -STOP PID
kill -SIGSTOP PID
…
3.进程优先级
进程的优先级由 nice 值和 renice 值决定,nice 值的范围通常是 -20 到 19,数值越小,进程的优先级越高,越容易获得 CPU 时间;数值越大,优先级越低,获得 CPU 时间的机会越少。普通用户只能提高进程的 nice 值(降低优先级),而 root 用户既可以提高也可以降低进程的 nice 值。