Skip to content

进程管理

进程管理是Linux系统管理的核心功能之一,它允许用户监控、控制和优化系统中运行的进程。通过进程管理,我们可以了解系统资源的使用情况,识别并终止异常进程,以及调整进程优先级来优化系统性能。

Linux提供了丰富的进程管理命令,这些命令可以帮助我们查看进程状态、管理进程生命周期、控制进程资源使用等。本章节将详细介绍常用的Linux进程管理命令,包括ps、top、kill、pkill、killall、pstree、nohup和jobs等。

ps - 显示系统进程状态

ps命令来自英文单词process的缩写,中文译为“进程”,其功能是显示当前系统的进程状态。使用ps命令可以查看到进程的所有信息,例如进程的号码、发起者、系统资源(处理器与内存)使用占比、运行状态等。ps命令可帮助我们及时发现哪些进程出现“僵死”或“不可中断”等异常情况。 ps命令经常会与kill命令搭配使用,以中断和删除不必要的服务进程,避免服务器的资源浪费。

语法格式

bash
ps [选项]

选项

选项说明
-A显示所有进程(同 -e)
-e显示所有进程
-a显示终端上的所有进程(除会话引导进程)
-d显示所有进程(除会话引导进程)
-f完整格式输出(显示命令行参数)
-F额外完整格式(比 -f 更多字段)
-H显示进程层次结构
-j显示作业控制信息
-l长格式输出
-L显示线程(LWP和NLWP列)
-M显示安全上下文(SELinux)
-o用户自定义格式
-y不显示标志(与 -l 一起使用)
-Z显示安全上下文(同 -M)

BSD风格选项

选项说明
aux显示所有用户的所有进程(常用组合)
-T显示该终端的所有进程
-m显示线程
-r只显示运行中的进程
-x显示无控制终端的进程

GNU长选项

选项说明
--forest树形显示进程层次
--sort指定排序字段(+field升序,-field降序)
--headers重复显示标题行
--no-headers不显示标题行
--format自定义输出格式(同 -o)
--pid显示指定PID的进程
--ppid显示指定PPID的子进程
--quick-pid快速检查指定PID

输出格式控制

bash
%cpu    	# CPU使用率
%mem    	# 内存使用率
args    	# 完整命令行
cmd     	# 简单命令名
command    	# 命令名
etime   	# 进程运行时间
euser   	# 有效用户名
fgroup  	# 文件系统组名
lstart  	# 进程启动时间
lWP			# 线程号
NLWP		# 该进程中的线程数
ni      	# nice值,优先级修改值取值范围-20到20
pcpu    	# CPU百分比(同%cpu)
pgid    	# 进程组ID
pid     	# 进程ID
ppid    	# 父进程ID
pri     	# 优先级
rss     	# 驻留集大小(内存)
stat    	# 进程状态
	S		# 休眠状态进程
	R		# 运行状态进程
	D		# 不可中断(正在等待系统分配资源)
	+		# 运行在前台进程
	Z		# 僵尸进程(需要定期清理)
time    	# 累计CPU时间
tty     	# 控制终端
	?		# 系统启动进程
	tty		# 本地登录
	pts		# 远程登录
user    	# 用户名
vsz     	# 虚拟内存大小

经典案例

bash
ps -ef      # UNIX风格
ps aux      # BSD风格
ps aux --sort=-pcpu | head -10   # 按CPU使用率降序前10
ps aux --sort=-pmem | head -10   # 按内存使用率降序前10
ps -ef --forest					# 树形显示进程关系
ps -ef | grep nginx       # 模糊匹配进程名
ps -C sshd -f             # 精确匹配命令名
ps -p 1234,5678           # 按PID筛选
ps -L -p <PID>            # 查看指定进程的线程
ps -eo pid,user,%cpu,%mem,cmd --sort=-%cpu  # 仅显示指定列
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%cpu | head -n 10		# 监控高CPU进程

kill – 杀死进程

kill 命令用于向进程发送信号,以终止、暂停或恢复进程的运行。它通过进程ID(PID)识别目标进程,并支持多种信号类型,允许用户以不同方式控制进程行为。

默认信号SIGTERM (15)(请求正常终止进程)

语法格式

bash
kill [选项] <PID>...  
kill -<> <PID>...  
kill -l [信号编号]

信号选项

信号编号信号名说明常用场景
1SIGHUP挂断进程,通常用于重启或重新加载配置(如守护进程)kill -1 <PID>kill -HUP48
2SIGINT中断进程(等同于 Ctrl+C交互式程序终止
9SIGKILL强制终止,进程无法捕获或忽略,直接由内核处理顽固进程终止17
15SIGTERM默认信号,请求进程正常退出(允许清理资源)kill <PID>39
18SIGCONT恢复已暂停的进程结合 SIGSTOP 使用
19SIGSTOP暂停进程(不可捕获或忽略),等同于 Ctrl+Z调试或暂停任务

选项

选项说明
-l列出所有信号名称
-s <信号>指定信号(如 -s 9-s SIGKILL
-<信号>直接使用信号(如 -9-KILL

经典案例

bash
kill 1234                # 默认信号(SIGTERM)终止进程
kill -9 1234             # 强制终止(SIGKILL)
kill -15 1234            # 明确指定 SIGTERM 信号
kill -HUP 1234           # 发送 SIGHUP 信号(常用于重载配置)
kill -l                  # 列出所有信号
kill -STOP 1234          # 暂停进程
kill -CONT 1234          # 恢复进程
kill $(pgrep nginx)      # 终止所有 nginx 进程(配合 pgrep)

NOTE

  • 进程无法捕获或忽略 SIGKILL,可能导致数据丢失。
  • 优先尝试 SIGTERM-15),给进程清理资源的机会。

pkill - 批量终止进程

pkillkill 的增强版,允许通过 进程名、用户、终端等条件 批量终止进程,无需手动查找 PID。

语法格式

bash
pkill [选项] <模式>

选项

选项说明
-f匹配完整命令行(而不仅是进程名)
-u按用户名匹配
-t按终端匹配(如 pts/0
-x精确匹配进程名
-n只杀最新的匹配进程
-o只杀最旧的匹配进程
-c统计匹配的进程数(不实际终止)
-l显示进程名(配合 -c 使用)

经典案例

bash
pkill -f "python"  			# 终止命令行包含 "python3" 的进程
pkill nginx         		# 终止所有名为 "nginx" 的进程 
pkill -u root       # 终止 root 用户的所有进程  
pkill -u bob,alice  # 终止多个用户的进程
pkill -t pts/1      # 终止来自终端 pts/1 的进程
pkill -9 nginx      # 强制终止(SIGKILL)  
pkill -15 python    # 优雅终止(SIGTERM,默认)  
pkill -STOP vim     # 暂停进程(SIGSTOP)  
pkill -CONT vim     # 恢复进程(SIGCONT)
pkill -u bob -t pts/2		# 终止某用户的 SSH 会话

注意事项

  • SIGKILL-9)是最后的强制手段

pkill - 按名称终止进程

pkill命令通过进程名称或其他属性匹配并终止进程,是kill命令的扩展。

语法格式

bash
pkill [选项] 模式

常用选项

选项说明
-u 用户名只终止指定用户的进程
-t 终端只终止指定终端的进程
-f匹配完整命令行
-n只终止最新的进程
-o只终止最旧的进程

经典案例

bash
pkill nginx  # 终止所有名为nginx的进程
pkill -u user1  # 终止用户user1的所有进程
pkill -f "python script.py"  # 终止特定的python进程

killall - 按进程名批量终止进程

killall 用于 按进程名批量终止进程(精确匹配),比 kill 更方便,但比 pkill 功能简单。

语法格式

bash
killall [选项] <进程名>

选项

选项说明
-e精确匹配进程名(默认)
-I忽略大小写
-i交互式终止(询问确认)
-r使用正则表达式匹配(类似 pkill
-s指定信号(如 -s 9-s KILL
-v显示详细信息(哪些进程被终止)
-w等待所有进程终止后再返回

经典案例

bash
killall nginx      # 终止所有名为 "nginx" 的进程
killall -9 python  # 强制终止所有 Python 进程
killall -u root    # 终止 root 用户的所有进程
killall -u bob     # 终止用户 bob 的所有进程
killall -15 nginx  # 优雅终止(SIGTERM,默认)
killall -9 vim     # 强制终止(SIGKILL)
killall -STOP bash # 暂停所有 Bash 进程 
killall -CONT bash # 恢复所有 Bash 进程
kill -1 5678           # 发送 SIGHUP,常用于重启守护进程(如 Nginx)
kill -19 1234          # 暂停 PID 1234(SIGSTOP)
kill -18 1234          # 恢复 PID 1234(SIGCONT)
kill 1234 5678         # 同时终止 PID 1234 和 5678
pkill nginx            # 终止所有名为 "nginx" 的进程
killall -9 python      # 强制终止所有 Python 进程
kill -9 $(ps -u username -o pid)  # 强制终止某用户的所有进程
kill -9 $(ps -A -ostat,ppid | awk '/[Zz]/ {print $2}')  # 终止僵尸进程的父进程

systemctl - 系统和服务管理器

systemd 是 Linux 系统的新型初始化系统和服务管理器,取代传统的 SysVinit。它提供:

  • 并行启动服务
  • 按需激活守护进程
  • 快照和系统状态恢复
  • 依赖关系管理

语法格式

bash
systemctl [OPTIONS] COMMAND [UNIT...]

主要命令

命令作用
systemctl start <服务名>启动服务(立即生效)
systemctl stop <服务名>停止服务
systemctl restart <服务名>重启服务
systemctl reload <服务名>重新加载配置(不重启服务)
systemctl status <服务名>查看服务状态(运行/失败/日志)
systemctl enable <服务名>开机自启
systemctl disable <服务名>开机不自启
systemctl is-active <服务名>检查服务是否正在运行
systemctl is-enabled <服务名>检查服务是否开机自启
systemctl enable --now <服务名>开机自启,并立即启动
systemctl disable --now <服务名>开机不自启,并立即关
systemctl status系统管理
journalctl -u <服务名>日志管理
journalctl查看系统日志

经典案例

bash
systemctl status nginx				# 查看服务状态
systemctl enable docker				# 设置开机启动
systemctl enable docker	--now		# 设置开机启动并立即启动
systemctl start sshd				# 启动服务
systemctl stop apache2				# 停止服务
systemctl restart mysql				# 重启服务

注意事项

  1. 配置文件路径:
    • 系统服务:/etc/systemd/system/
    • 用户服务:~/.config/systemd/user/
  2. 修改配置后需要重载:systemctl daemon-reload
  3. 查看日志journalctl -u service_name
  4. 不同发行版差异:
    • Ubuntu 16.04+ 默认使用
    • CentOS 7+ 默认使用
    • 旧版系统可能需要手动安装

journalctl - 查询 systemd 日志

journalctl 是 systemd 提供的日志管理工具,用于查看和分析系统日志。它替代了传统的 syslog,并提供了更强大的日志过滤、搜索和格式化功能。

语法格式

bash
journalctl [OPTIONS] [MATCHES...]

选项

选项说明
-u UNIT查看指定服务的日志
-b查看本次启动的日志
-f实时跟踪日志(类似 tail -f
-n NUM显示最近的 NUM 条日志
-k仅显示内核日志
--since "YYYY-MM-DD HH:MM:SS"查看指定时间之后的日志
--until "YYYY-MM-DD HH:MM:SS"查看指定时间之前的日志
-p PRIORITY按日志级别过滤(如 emerg, alert, crit, err, warning, notice, info, debug
-o json以 JSON 格式输出日志
--no-pager直接输出(不进入分页模式)

经典案例

bash
journalctl						# 查看所有日志
journalctl -u nginx				# 查看特定服务的日志
journalctl -f					# 实时跟踪日志(类似 tail -f)
journalctl -n 50				# 查看最近 50 条日志
journalctl -b					# 查看本次启动的日志
journalctl -p err				# 查看错误级别的日志
journalctl --since "2023-10-01 00:00:00" --until "2023-10-02 23:59:59"		# 查看特定时间段的日志
journalctl -k					# 查看内核日志
journalctl _PID=1234			# 查看某个进程的日志
journalctl -u sshd --no-pager > sshd.log		#导出日志到文件​

注意事项

  1. 权限要求

    • 普通用户只能查看自己的日志。

    • 使用sudo

      查看系统日志:

      bash
      sudo journalctl
  2. 日志存储位置

    • 默认存储在 /var/log/journal/(如果存在)。
    • 如果未启用持久化存储,重启后日志会丢失。
  3. 启用持久化存储

    bash
    sudo mkdir -p /var/log/journal
    sudo systemd-tmpfiles --create --prefix /var/log/journal
    sudo systemctl restart systemd-journald
  4. 日志大小限制

    • 默认限制在/etc/systemd/journald.conf中配置:

      ini
      SystemMaxUse=500M
      RuntimeMaxUse=100M

nohup - 后台持久运行命令

命令简介

nohup(no hang up)用于在用户注销后仍保持命令运行,防止进程收到SIGHUP信号终止,常与&配合使用实现后台运行。

语法格式

bash
nohup 命令 [参数] &

经典案例

bash
# 基础后台运行(输出重定向到nohup.out)
nohup python app.py &

# 自定义输出文件
nohup ./server.sh > server.log 2>&1 &

# 忽略所有输出
nohup command > /dev/null 2>&1 &

# 配合timeout运行
nohup timeout 24h ./batch_process.sh &

# 查看运行中的nohup作业
jobs -l

注意事项

  1. 默认输出重定向到nohup.out文件
  2. 退出终端前建议用disown移除作业
  3. 对于重要服务,建议使用systemdscreen替代
  4. 可通过ps -ef | grep 命令查看运行状态

jobs - 作业控制管理命令

命令简介

jobs 是 Shell 内置命令,用于查看和管理当前 Shell 会话中的后台作业(background jobs)。这些作业通常是通过在命令末尾添加 & 符号或使用 Ctrl+Z 挂起的任务。

语法格式

bash
jobs [选项] [作业标识符]

常用选项

选项描述示例
-l显示作业的 PIDjobs -l
-p仅显示作业的进程组 IDjobs -p
-n仅显示上次通知后有状态改变的作业jobs -n
-r仅显示运行中的作业jobs -r
-s仅显示已停止的作业jobs -s

作业标识符

标识符描述示例
%n作业号 nfg %1
%str以 str 开头的作业kill %python
%?str包含 str 的作业bg %?script
%%%+当前作业kill %%
%-前一个作业fg %-

经典案例

bash
# 启动后台作业
sleep 60 &
python script.py &

# 查看所有作业
jobs -l
# 输出示例:[1]  - 12345 running    sleep 60
#          [2]  + 12346 running    python script.py

# 将作业调到前台
fg %1

# 继续运行被挂起的作业
bg %2

# 终止特定作业
kill %?script

# 仅显示运行中的作业
jobs -r

# 显示作业的进程ID
jobs -p %1

# 启动并立即disown作业
python long_running.py &!

# 等待特定作业完成
wait %1

# 复杂作业控制
(sleep 10; echo Done) &  # 启动子Shell作业
jobs -l                  # 查看作业状态

相关命令

  1. Ctrl+Z - 挂起当前前台作业
  2. bg - 将挂起的作业转为后台运行
  3. fg - 将后台作业调至前台
  4. disown - 从作业表中移除作业
  5. wait - 等待作业完成

注意事项

  1. 作业控制是 Shell 的功能,不同 Shell(bash、zsh 等)可能有细微差异
  2. 退出终端会导致作业终止(除非使用 nohupdisown
  3. 作业号在每次 Shell 启动时重新计数
  4. 使用 &|&!(zsh)可以立即 disown 一个作业

jobs 命令是 Shell 作业控制的核心工具,合理使用可以有效地管理多个并发任务,特别适用于需要同时处理多个耗时操作的场景。

lsof - 列出打开进程

命令简介

lsof(list open files)显示系统打开的文件列表,实质可查看:

  • 常规文件
  • 目录
  • 网络连接
  • 设备文件
  • Unix域套接字

常用选项

选项描述示例
-i网络连接lsof -i :80
-p指定进程lsof -p 1234
-u指定用户lsof -u root
-c命令匹配lsof -c nginx
+d目录文件lsof +d /var/log
-t仅显示PIDlsof -t /var/lock/file.lock

经典案例

bash
# 查看端口占用
lsof -i :22

# 查看进程打开的文件
lsof -p $(pidof nginx)

# 查找删除但未释放的文件
lsof /var/log/ | grep deleted

# 查看用户活动
lsof -u www-data

# 恢复被删除的文件(通过/proc)
ls -l /proc/$(lsof -t /path/to/file)/fd/

系统管理应用

bash
# 强制释放占用文件的进程
kill -9 $(lsof -t /mountpoint)

# 检查异常网络连接
lsof -i -n -P

# 查看SSH连接来源
lsof -i | grep sshd

service - 系统服务管理

命令简介

service是SysV初始化系统的服务管理工具,用于启动/停止系统服务。现代系统通常使用systemctl替代,但仍兼容此命令。

语法格式

bash
service 服务名 操作

常用操作

操作描述示例
start启动服务service nginx start
stop停止服务service mysql stop
restart重启服务service ssh restart
reload重载配置service haproxy reload
status服务状态service docker status

经典案例

bash
# 查看所有服务状态
service --status-all

# 带详细日志重启
service apache2 restart -v

# 测试新配置(不实际重载)
service nginx configtest

# 传统服务管理(等价于)
/etc/init.d/nginx restart

注意事项

  1. 在systemd系统中实际调用的是systemctl的兼容接口
  2. 对于新服务建议直接使用systemctl
  3. 不同发行版的服务脚本位置可能不同(/etc/init.d/)
  4. 可通过chkconfigupdate-rc.d管理启动项

现代替代方案

bash
# systemd标准用法
systemctl start nginx
systemctl enable docker

# 查看服务日志
journalctl -u nginx

这三个命令分别代表了Linux系统管理的三个重要方面:进程持久化、资源监控和服务控制,是系统管理员日常故障排查和维护的基础工具。