1. 进程的定义、组成和环境
什么是进程?
想象你的电脑是一个大工厂,进程就是工厂里正在运行的机器。每个机器(进程)都有自己的任务,比如一台机器负责打印文件,另一台负责播放音乐。
-
进程的组成:
-
代码:机器的操作说明书(程序的代码)。
-
数据:机器当前使用的原材料(程序运行时需要处理的数据)。
-
运行状态:机器是否在运行、暂停或故障(如 CPU 寄存器、内存地址)。
-
-
进程环境:
每台机器需要特定的环境才能工作,比如电力、温度。进程的环境包括:-
环境变量:全局配置参数(如
PATH
指定去哪里找工具)。 -
文件描述符:机器与外界的连接管道(如打开的文件、网络连接)。
-
2. 如何理解 systemd 进程?
-
systemd 是 Linux 系统的“工厂总控中心”。
-
作用:它是系统的第一个进程(PID=1),负责启动和管理所有其他进程(服务)。
-
类比:工厂的调度员,决定哪些机器先启动、如何重启故障机器。
-
-
常见操作:
systemctl start nginx # 启动 Nginx 服务(启动一台新机器) systemctl stop nginx # 关闭 Nginx 服务 systemctl enable nginx # 开机自动启动 Nginx
3. ps
和 top
有什么区别?
-
ps
:给工厂拍一张“静态照片”,显示当前所有机器的状态快照。-
特点:一次性输出,适合查看特定时刻的进程信息。
-
-
top
:实时监控工厂的“实时视频”,动态显示进程状态(如 CPU、内存占用)。-
特点:持续更新,适合观察资源使用情况。
-
通俗总结:
-
ps
是“查档案”,top
是“看直播”。
4. ps aux
和 ps -ef
的作用
-
ps aux
:-
参数含义:
-
a
:显示所有用户的进程。 -
u
:显示详细信息(如 CPU、内存占用)。 -
x
:包括没有控制终端的进程(如后台服务)。
-
-
输出示例:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.1 12345 678 ? Ss 10:00 0:01 /sbin/init
-
-
ps -ef
:-
参数含义:
-
-e
:显示所有进程。 -
-f
:显示完整格式(如父进程 PID)。
-
-
输出示例:
UID PID PPID C STIME TTY TIME CMD root 1 0 0 10:00 ? 00:00:01 /sbin/init
-
核心区别:
-
ps aux
侧重资源占用,ps -ef
侧重进程关系(如父子进程)。
5. 进程状态有哪些?
在 ps
或 top
的 STAT
列中,进程状态用单个字母表示:
-
R
(Running):正在运行或等待 CPU(绿灯行)。 -
S
(Sleeping):睡眠中,等待事件唤醒(如等待输入)。 -
D
(Uninterruptible Sleep):深度睡眠,不可被唤醒(如等待磁盘 I/O)。 -
T
(Stopped):被信号暂停(如按Ctrl+Z
)。 -
Z
(Zombie):僵尸进程,已结束但未被父进程回收(工厂垃圾未清理)。
通俗理解:
-
进程像交通信号灯,不同状态决定它是否能继续运行。
6. 作业和作业控制
-
作业(Job):用户启动的一个或多个关联进程(如一条命令
sleep 100 &
就是一个作业)。 -
作业控制:管理前台和后台任务。
常用操作:
-
&
:后台运行作业(机器在后台默默工作)。sleep 100 & # 后台运行 sleep
-
Ctrl+Z
:暂停当前作业(把机器临时关机)。 -
jobs
:查看当前所有作业。 -
fg %1
:将作业 1 调到前台(重新启动机器)。 -
bg %1
:让作业 1 在后台继续运行。
7. kill
命令中信号 9 和 15 的区别
-
SIGTERM(15)
:礼貌地请求进程终止(默认信号)。-
作用:进程可以“收拾行李”再退出(如保存文件、关闭连接)。
-
命令:
kill -15 PID
-
-
SIGKILL(9)
:强制终止进程(不给任何反应时间)。-
作用:直接拔电源,可能导致数据丢失。
-
命令:
kill -9 PID
-
使用建议:
-
优先用
SIGTERM
,若进程无响应再用SIGKILL
。
8. TTY 终端是什么?
-
TTY(Teletype):早期的物理终端设备(像打字机),现代指虚拟终端或终端模拟器。
-
查看进程的 TTY:
ps aux | grep nginx
-
?
表示没有关联终端(通常是后台服务)。 -
pts/0
表示伪终端(如 SSH 连接的终端)。
-
9. 显式发送信号的其他方式
除了 kill
,还可以通过以下方式发送信号:
-
killall
:通过进程名发送信号。killall -9 nginx # 强制终止所有 nginx 进程
-
pkill
:通过模式匹配进程名。pkill -f "python script.py"
-
键盘快捷键:
-
Ctrl+C
:发送SIGINT
(终止前台进程)。 -
Ctrl+Z
:发送SIGTSTP
(暂停前台进程)。
-