未记录事实核验 · 状态:现行内容

记录仅说明核验时间与维护状态,不保证适用于所有环境;使用前请留意正文中的版本、适用条件与风险提示。

warning 适用边界与维护说明

本文适用于一般 Linux 命令行下的进程查看、信号操作、资源监控和终端会话管理,tmux 与 sleep 模拟练习可独立完成。执行终止命令前应核对目标 PID、用户及匹配范围;安装工具和写入 /var/log 等目录需具备相应权限。nohup、Bash 的 bg/disown 与 tmux 不构成任务持久运行保证,断线后的行为仍取决于信号处置、终端输入输出及会话是否存活。Spark/YARN 两处工作流均为已有环境下的示例,需自备应用 JAR、有效主类和参数,并替换日志路径、用户及资源配置;集群应用状态应通过实际 application ID 查询,不能由本地提交进程 PID 推断。本次仅作全文结构审阅,未进行命令实测或外部事实、链接核验。

进程与任务管理 - ps/top/nohup/tmux 实战

abstract 本文概要

  • ps/top:查看系统进程状态
  • kill:终止进程
  • nohup:SSH 断开后任务继续跑
  • screen/tmux:终端复用,管理多个会话
  • 数据工程师的实际使用场景

为什么要懂进程管理

数据工作中最典型的痛点:

下午 3 点提交了一个 Spark 任务,要跑 6 个小时。结果下班时 SSH 断开了,任务也随之中断。

解决这个问题,就是本篇的核心内容。


ps - 查看进程

ps(Process Status)查看当前运行的进程。

# 查看当前用户的进程
ps

# 查看所有进程(最常用的组合)
ps aux
# a:显示所有用户的进程
# u:以用户格式显示(含 CPU、内存占用)
# x:显示没有控制终端的进程(后台进程)

# 查看所有进程,完整格式
ps -ef

# 按名称过滤进程(查找特定程序)
ps aux | grep python
ps aux | grep spark
ps aux | grep java | grep -v grep   # -v grep 去掉 grep 自身那行

# 只显示特定用户的进程
ps -u alice

# 显示进程树(展示父子关系)
ps -ejH
# 或者用 pstree
pstree -p

ps aux 输出解读:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
alice     1234  5.2 12.3 2134568 506580 ?      S    09:00   2:30 python etl.py
root      5678  0.0  0.1  65536  4096 ?        Ss   08:00   0:00 sshd

# 字段说明:
# USER:进程所属用户
# PID :进程 ID(Process ID),可以用 kill 终止
# %CPU:CPU 使用率
# %MEM:内存使用率
# VSZ :虚拟内存大小(KB)
# RSS :实际占用物理内存(KB)
# STAT:进程状态(R=运行,S=睡眠,Z=僵尸,D=不可中断睡眠)
# START:进程启动时间
# TIME:CPU 累计使用时间
# COMMAND:命令

top - 实时监控系统资源

top 是实时动态显示系统资源使用情况的工具。

# 启动 top
top

# 指定刷新间隔(秒)
top -d 2    # 每 2 秒刷新

# 只显示特定用户的进程
top -u alice

# 只显示特定进程
top -p 1234,5678

top 界面解读:

top - 09:30:00 up 5 days, 12:30,  3 users,  load average: 2.50, 2.10, 1.95
Tasks: 256 total,   2 running, 254 sleeping
%Cpu(s): 35.5 us, 12.3 sy, 0.0 ni, 51.2 id, 1.0 wa, 0.0 hi, 0.0 si
MiB Mem : 62856.0 total, 12456.0 free, 35678.0 used, 14722.0 buff/cache
MiB Swap:  2048.0 total,  2048.0 free,     0.0 used. 25678.0 avail Mem

  PID USER     PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
 1234 alice    20   0 8123456 4567890  12345 R  85.2  14.3   2:30.00 java
  • load average:系统平均负载(1/5/15 分钟),包含可运行任务和不可中断睡眠任务;持续高于可用 CPU 数量提示可能存在资源压力,需结合 CPU 利用率和 I/O 等指标判断
  • %Cpu(s):CPU 各状态占比(us=用户,sy=系统,id=空闲,wa=等待IO)
  • Mem:内存使用情况

top 内部快捷键:

键 功能
q 退出
k 杀死进程(输入 PID)
M 按内存使用排序
P 按 CPU 使用排序
1 展开显示所有 CPU 核心
f 选择显示的列
u 过滤指定用户

tip htop 比 top 更好用

如果服务器上装了 htop,优先用它。界面更友好,支持鼠标操作,颜色高亮,可以直接鼠标点击排序。

# 安装 htop
yum install -y htop     # CentOS
apt install -y htop     # Ubuntu

kill - 终止进程

# 发送终止信号(默认 SIGTERM,让进程优雅退出)
kill 1234

# 强制终止(SIGKILL,进程来不及清理直接终止)
kill -9 1234

# 按进程名终止(不需要找 PID)
killall python
pkill -f "etl.py"   # 按命令行匹配终止

# 只读预览命令行匹配的进程;核对 PID、用户和命令后再决定是否发送信号
pgrep -af "spark"

# 重新加载配置(发送 SIGHUP 信号,很多程序支持)
kill -HUP 1234
kill -1 1234    # 等效

warning kill -9 是最后手段

优先用 kill PID(SIGTERM),给进程机会做清理工作(关闭文件、提交事务等)。 只有进程不响应时,才用 kill -9 强制终止。 强制终止 Hadoop/Spark 进程可能导致数据损坏。


nohup - SSH 断开后任务继续跑

nohup(No Hang Up)让启动的命令忽略 SIGHUP 信号;SSH 断开可能通过终端挂断或 Shell 行为影响任务,但并非所有进程都会因此退出。nohup 本身不会将命令放入后台,需要配合 &;它也不保证任务在崩溃、主机重启或外部清理后继续运行。

# 基本用法
nohup 命令 &
# & :放到后台运行
# nohup:SSH 断开后继续运行

# 示例
nohup python etl.py &

# 指定输出文件(默认输出到 nohup.out)
nohup python etl.py > /var/log/etl.log 2>&1 &

# 运行后会显示后台进程的 PID
# [1] 12345
# 记住这个 PID,方便后续查看或终止

查看和管理 nohup 进程:

# 查看后台作业(当前 Shell 的)
jobs

# 查看 nohup 进程
ps aux | grep etl.py

# 查看实时输出
tail -f nohup.out
tail -f /var/log/etl.log

# 终止 nohup 进程
kill 12345

# 在 Bash 中将前台作业转入后台并移出作业表;这不等同于用 nohup 启动
# 1. 先 Ctrl+Z 暂停
# 2. 再 bg 放到后台
# 3. 再 disown 移出 Bash 作业表,避免 Bash 按作业向其转发 SIGHUP
# 已有输入输出可能仍连接原终端,不能据此保证断线后正常运行
Ctrl+Z
bg
disown

note nohup 的局限

nohup 没有会话管理能力。断线重连后,无法直接看到进程的输出,只能 tail -f 看日志。 对于需要长期管理的会话,推荐用 tmux。


tmux - 终端复用神器

tmux(Terminal Multiplexer)是数据工程师必备工具,解决了 nohup 无法解决的问题:

  1. 断线恢复:SSH 断开再连,可以重新接回原来的 tmux 会话
  2. 分屏:一个终端分多个窗口,同时看日志+写命令
  3. 会话管理:创建多个会话,按项目组织

tmux 基本概念

Session(会话)
└── Window(窗口,像浏览器标签页)
    └── Pane(面板,窗口内的分屏)

常用命令

# 安装 tmux
yum install -y tmux     # CentOS
apt install -y tmux     # Ubuntu

# 创建新会话
tmux new-session -s etl_job   # -s 指定会话名称
tmux new -s etl_job           # 简写

# 列出所有会话
tmux list-sessions
tmux ls

# 重新接入已有会话(断线重连必用!)
tmux attach -t etl_job
tmux a -t etl_job          # 简写
tmux a                     # 接入最近的会话

# 删除会话
tmux kill-session -t etl_job

tmux 快捷键(前缀键 Ctrl+B)

note 前缀键

tmux 所有快捷键都需要先按 Ctrl+B(前缀键),再按功能键。

操作 快捷键
新建窗口 Ctrl+B c
切换到下一个窗口 Ctrl+B n
切换到上一个窗口 Ctrl+B p
按编号切换窗口 Ctrl+B 0~9
重命名当前窗口 Ctrl+B ,
水平分屏 Ctrl+B %
垂直分屏 Ctrl+B "
在面板间切换 Ctrl+B 方向键
关闭当前面板 Ctrl+B x
暂时离开会话(detach) Ctrl+B d
滚动查看历史 Ctrl+B [ (q 退出)
查看所有会话 Ctrl+B s

数据工作中的 tmux 工作流

# 典型工作流:提交 Spark 任务 + 实时监控

# 1. 创建 tmux 会话
tmux new -s spark_job

# 2. 在第一个窗口提交 Spark 任务
spark-submit --master yarn --class com.example.DataJob job.jar

# 3. 新建第二个窗口(Ctrl+B c)
# 在第二个窗口实时查看日志
tail -f /var/log/spark/application_xxx.log | grep -i "error\|warn\|progress"

# 4. 新建第三个窗口(Ctrl+B c)
# 可以继续干其他事情,或者监控系统资源
top -u alice

# 5. 需要离开时(比如下班了)
# 按 Ctrl+B d 暂时离开(任务继续跑)

# 6. 第二天来了,重新接入
tmux a -t spark_job
# 所有窗口和内容都还在!

screen - tmux 的前辈

screen 是另一种终端复用工具;若当前环境已安装 screen 而没有 tmux,可使用它管理会话,不能假定所有 Linux 系统都预装。

# 创建新 screen 会话
screen -S etl_job

# 在会话中运行任务后,按 Ctrl+A d 暂时离开

# 查看所有 screen 会话
screen -ls

# 重新接入
screen -r etl_job
screen -r 12345    # 用 PID 接入

# 如果接入报错(says it is attached),强制接入
screen -D -r etl_job
操作 快捷键(screen 用 Ctrl+A)
离开会话 Ctrl+A d
新建窗口 Ctrl+A c
切换窗口 Ctrl+A n / Ctrl+A p
查看窗口列表 Ctrl+A "
滚动查看历史 Ctrl+A [

系统资源监控命令

# 查看内存使用(free = 剩余,buff/cache = 缓存,available = 实际可用)
free -h

# 查看磁盘使用
df -h

# 查看磁盘 IO(判断是否 IO 瓶颈)
iostat -x 1 5   # 每 1 秒刷新,共 5 次(需要 sysstat 包)

# 查看网络流量
sar -n DEV 1 5  # 每秒显示网络接口流量

# 查看 CPU 核数
nproc
cat /proc/cpuinfo | grep "processor" | wc -l

# 查看系统运行时间和负载
uptime

# 系统整体信息
uname -a        # 内核版本、系统架构
cat /etc/os-release   # 发行版信息(Ubuntu 版本等)

实战:已有 Spark/YARN 环境下的任务提交示例

以下假设已有可用的 Spark/YARN 环境、可访问的应用 JAR、有效主类及对应应用参数,并具备日志目录写权限。JAR 名称、主类、日期、路径和资源配置均为示例,需按应用与集群配额调整;本地提交进程 PID 不代表集群应用状态。

# 1. 创建专属 tmux 会话
tmux new -s daily_etl_20260318

# 2. 准备日志目录
mkdir -p /var/log/etl/20260318

# 3. 提交任务(在后台运行,输出重定向到日志)
spark-submit \
    --master yarn \
    --deploy-mode cluster \
    --driver-memory 4g \
    --executor-memory 8g \
    --executor-cores 4 \
    --num-executors 10 \
    --class com.example.DailyETL \
    daily-etl-1.0.jar \
    --date 2026-03-18 \
    > /var/log/etl/20260318/spark-submit.log 2>&1 &

JOB_PID=$!
echo "本地 spark-submit 进程 PID:${JOB_PID}"

# 4. 实时监控日志(另开一个 tmux 窗口:Ctrl+B c)
tail -f /var/log/etl/20260318/spark-submit.log

# 5. 如果需要离开:Ctrl+B d
# tmux 保留本地终端会话;YARN cluster 模式的应用在集群中运行,状态需单独查询

# 6. 回来检查:tmux a -t daily_etl_20260318

# 7. 查看本地提交进程是否仍存在;这不代表 YARN 应用状态
ps -p "${JOB_PID}" -o pid,stat,args
# 从提交输出或 YARN 应用列表取得实际 application ID,再查询集群应用状态
# 将下面的示例 ID 替换为实际值
yarn application -status application_实际时间戳_实际序号

快速参考

命令 用途 常用参数
ps aux 查看所有进程 grep 过滤
top 实时监控资源 M 按内存,P 按 CPU
kill PID 发送终止信号 -9 强制,-HUP 重载
nohup cmd & 后台不挂断运行 > log 2>&1 重定向
tmux new -s 名称 创建 tmux 会话 -
tmux a -t 名称 重新接入会话 -
Ctrl+B d 暂时离开 tmux -
free -h 查看内存 -
df -h 查看磁盘 -


info 前置知识

  • SSH远程连接 - SSH 会话断开可能因终端挂断、Shell 转发 SIGHUP 或终端输入输出失效而影响任务;理解这些条件有助于选择 tmux/nohup
  • 管道与重定向 - 后台任务的日志输出需要用重定向保存

掌握检查

  • [ ] 能用 ps aux | grep 进程名 找到目标进程,并读懂 PID、CPU%、MEM% 列的含义
  • [ ] 知道 kill -9 和 kill -15 的区别:-15 是优雅停止(进程可以做清理),-9 是强制杀死
  • [ ] 能创建 tmux 会话、在会话中运行任务、断开(Ctrl+B d)再重新接入(tmux a -t 会话名)
  • [ ] 知道 nohup cmd > log.txt 2>&1 & 各部分的含义,以及什么时候用 nohup 而不是 tmux
  • [ ] 能用 top 找出 CPU 或内存使用率最高的进程,并通过 k 键发送 kill 信号

实践练习

基础题:用 tmux 创建一个名为 test_session 的会话,在其中运行 ping localhost,然后用 Ctrl+B d 离开会话,用 tmux ls 确认会话仍在运行,再重新接入并停止 ping。

进阶题:模拟大数据任务提交场景:创建 tmux 会话 spark_job,在其中执行一个长时间运行的命令(如 sleep 300,代表 Spark 任务),离开会话,用 ps aux 找到该进程的 PID,然后用 kill -15 优雅终止它,确认进程已退出。


下一步

#Linux #进程管理 #tmux #nohup #数据工程