未记录事实核验 · 状态:现行内容
记录仅说明核验时间与维护状态,不保证适用于所有环境;使用前请留意正文中的版本、适用条件与风险提示。
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 无法解决的问题:
- 断线恢复:SSH 断开再连,可以重新接回原来的 tmux 会话
- 分屏:一个终端分多个窗口,同时看日志+写命令
- 会话管理:创建多个会话,按项目组织
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 前置知识
掌握检查
- [ ] 能用
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 优雅终止它,确认进程已退出。
下一步
- 定时任务crontab - 让脚本定时自动运行,不用手动执行
- 网络与数据传输 - 在任务管理之外,学会传输数据
#Linux #进程管理 #tmux #nohup #数据工程