Linux怎么用&和jobs后台执行python

听雨眠
听雨眠
发布时间:2026-11-13| 6人浏览过
原创

详细介绍Linux终端中如何使用&符号将Python脚本放入后台执行,配合jobs、fg、bg与kill命令查看、切换和管理后台Python任务,并说明日志重定向、缓冲区刷新及终端断开时的处理方法。

在Linux终端运行耗时较长的Python脚本时,直接在命令行末尾加上&符号即可将脚本放入后台执行,立刻释放当前终端提示符;随后使用jobs命令可以查看当前Shell会话中的所有后台任务状态与作业编号,并配合fg、bg和kill完成前后台切换与进程终止。下面按照实际操作顺序,说明从启动后台脚本、重定向日志到管理作业状态的完整流程。

一、准备测试脚本与运行环境

为了演示后台执行与作业查看的效果,先在Linux用户目录(假设工作目录为/home/user/scripts,Python版本为Python 3)创建一个持续运行的示例脚本process_data.py。该脚本每隔3秒输出一行当前进度,共循环20次。

终端命令(执行位置:/home/user/scripts)
mkdir -p /home/user/scripts && cd /home/user/scripts
cat << 'EOF' > process_data.py
import time
import sys

for step in range(1, 21):
    print(f"[Step {step}/20] 正在处理数据批次 {step}...")
    time.sleep(3)

print("数据处理完成。")
EOF

如果直接执行python3 process_data.py,终端会被该进程完全占用,在60秒运行结束前无法输入其他命令。想要让脚本在后台运行并同时保留日志,需要使用&配合输出重定向。

二、使用 & 将Python脚本放入后台执行

在启动命令的末尾添加&,Shell会将该Python进程作为后台作业启动,立即返回作业号(Job ID)和系统进程号(PID)。在实际使用中,建议同时加上-u参数和输出重定向。

终端命令(执行位置:/home/user/scripts)
python3 -u process_data.py > run.log 2>&1 &
示例输出
[1] 28451

返回结果中的[1]表示该任务在当前Shell会话中的作业号(Job Number),28451则是操作系统分配的进程号(PID)。此时命令行提示符立即恢复,可以继续执行ls、tail -f run.log或其他操作。

这条启动命令包含三个影响后台运行稳定性的关键点:

  • -u 参数(禁用输出缓冲):Python将输出重定向到文件时,默认开启块缓冲,print()的内容会攒够一定大小或等脚本结束才写入文件。加上-u后,标准输出和标准错误不经过缓冲,直接写入run.log,方便用tail -f run.log实时观察进度。
  • > run.log 2>&1(合并重定向输出):如果不做重定向,后台Python脚本的print()内容和报错信息依然会直接打印到当前终端屏幕上,打断你正在输入的其他命令。> run.log将标准输出写入文件,2>&1将标准错误合并到标准输出。
  • 末尾的 &(后台控制符):必须放在整条命令的最右侧,通知Shell在子进程中异步执行该命令,不阻塞前台输入。
Linux怎么用&和jobs后台执行python
图 1:使用 & 启动后台 Python 脚本并重定向日志的执行流程

三、使用 jobs 命令查看后台Python任务

当一个或多个Python脚本在后台运行时,使用Shell内置的jobs命令可以查看当前终端会话管理的全部作业列表。推荐加上-l选项,同时显示每个作业对应的系统PID。

终端命令(执行位置:/home/user/scripts)
jobs -l
示例输出
[1]+ 28451 Running                 python3 -u process_data.py > run.log 2>&1 &

如果此时再启动第二个后台Python脚本(例如python3 -u process_data.py > run2.log 2>&1 &),再次运行jobs -l会看到多个任务的排列标记:

示例输出(存在两个后台作业时)
[1]- 28451 Running                 python3 -u process_data.py > run.log 2>&1 &
[2]+ 28519 Running                 python3 -u process_data.py > run2.log 2>&1 &

输出内容从左到右分为四个部分,各自承担不同的定位作用:

  • [1]、[2](作业号):当前Shell分配给后台任务的序号。后续使用fg、bg或kill操作作业时,在序号前加百分号(如%1、%2)即可引用对应任务,无需记忆冗长的PID。
  • + 与 -(优先级标记):+代表“当前默认作业”(通常是最近一个被放入后台或被暂停的任务),当执行fg或bg不带参数时,默认操作带有+的任务;-代表“上一个默认作业”。
  • 28451(PID):由-l参数显示的系统进程ID,用于ps、top或跨终端管理。
  • 状态词(Running / Stopped / Done):Running表示正在后台正常执行;Stopped表示进程被挂起暂停(例如按下了Ctrl+Z,或后台脚本尝试读取终端输入);Done表示脚本已正常执行完毕。
Linux怎么用&和jobs后台执行python
图 2:jobs -l 输出结构与常用过滤选项
注意:jobs维护的是当前Shell会话的作业表。如果你另外打开了一个新的SSH终端窗口,在新窗口中输入jobs不会看到原窗口启动的Python任务。在其它终端窗口排查时,应使用ps -ef | grep process_data.py并通过PID来定位。

四、前后台切换与暂停恢复(fg、Ctrl+Z、bg)

日常操作中经常遇到两种情况:一是启动Python脚本时忘记在末尾加&,脚本已经跑了一半不想中断重来;二是需要把后台运行的脚本调回前台排查或手动终止。这时需要配合使用Ctrl+Z、bg和fg。

1. 启动时忘记加 &,如何转入后台继续运行

假设你直接运行了python3 process_data.py,终端已被阻塞。按以下三步即可在不杀死进程的前提下将其转入后台运行:

  1. 在当前终端按下快捷键 Ctrl+Z:向当前前台Python进程发送SIGTSTP信号,将其暂停并挂起到后台。终端会提示[1]+ Stopped python3 process_data.py。
  2. 输入jobs -l确认作业编号(假设为[1]),此时该Python进程处于Stopped暂停状态,代码并未继续往下跑。
  3. 输入bg %1:向1号作业发送SIGCONT继续信号,使其在后台恢复为Running状态。
终端命令(在前台脚本按下 Ctrl+Z 后执行)
jobs -l
bg %1
jobs -l
示例输出
[1]+ 28610 Stopped                 python3 process_data.py
[1]+ python3 process_data.py &
[1]+ 28610 Running                 python3 process_data.py &

2. 将后台任务调回前台(fg)

如果需要将后台正在运行或暂停的1号作业调回前台终端,执行fg %1即可:

终端命令
fg %1
示例输出
python3 -u process_data.py > run.log 2>&1

执行后,该Python进程重新占用当前终端前台,此时可以直接按Ctrl+C终止它,或者再次按Ctrl+Z暂停。

Linux怎么用&和jobs后台执行python
图 3:前台运行、后台运行与后台暂停之间的状态转换关系

五、终止后台Python任务与常见异常排查

需要提前结束后台运行的Python脚本时,不需要将它调回前台,直接通过kill命令配合%作业号或系统PID即可终止。

1. 使用 kill %作业号 终止后台脚本

先用jobs -l确认目标脚本的作业号,然后执行kill %作业号(默认发送SIGTERM信号,允许Python执行清理逻辑后退出):

终端命令
jobs -l
kill %1
jobs -l
示例输出
[1]+ 28451 Running                 python3 -u process_data.py > run.log 2>&1 &
[1]+  Terminated              python3 -u process_data.py > run.log 2>&1
(第二次执行 jobs -l 无输出,说明作业已从列表中移除)

如果脚本处于Stopped暂停状态,或者捕获了终止信号拒不退出,可以使用kill -9 %1强制终止。

2. 为什么后台Python脚本突然变成 Stopped (tty input)

有时用&启动Python脚本后,执行jobs -l发现它很快变成了如下状态:

示例输出
[1]+ 28790 Stopped (tty input)     python3 interactive_task.py

这是因为Python代码中包含了input()、sys.stdin.read(),或者脚本内部调用了需要交互确认的命令(例如未加-y参数的工具)。后台作业没有终端键盘的控制权,一旦尝试读取终端标准输入,Linux内核就会向其发送SIGTTIN信号強制挂起。解决方法有两个:

  • 将脚本中的交互式input()改为通过argparse命令行参数或配置文件传入;
  • 如果只需要一次性输入固定内容,可在启动时通过管道或重定向提供输入,如python3 interactive_task.py < input.txt > run.log 2>&1 &。

3. 关闭SSH终端前如何防止后台任务中断

单纯使用python3 script.py &启动的任务,其父进程仍然是当前Shell。如果直接关闭SSH终端窗口或网络断开,Shell退出时通常会向关联作业发送SIGHUP挂断信号,导致后台Python脚本被一并终止。

如果你已经用&启动了脚本,现在需要关闭SSH窗口下班离开,可以在当前终端执行disown %1,将该作业从当前Shell的作业表中移出并屏蔽SIGHUP信号:

终端命令(让已运行的 1 号后台作业脱离当前终端会话)
disown -h %1

执行disown -h %1后,即便关闭SSH连接,Python进程也会继续在服务器后台运行直至结束;若一开始就明确知道脚本需要跨SSH会话长时间运行,也可以在启动时直接使用nohup python3 -u process_data.py > run.log 2>&1 &。

六、常用命令与适用场景总结

围绕Linux终端中使用&和jobs管理后台Python任务的完整操作,可以通过下表与总览图快速核对各命令的语法和边界:

操作目标 完整命令写法(以作业1为例) 关键作用与结果验证
后台启动并记录实时日志 python3 -u process_data.py > run.log 2>&1 & 返回 [1] PID,日志无缓冲写入 run.log
查看当前终端后台作业 jobs -l 列出作业号、+/-标记、PID 与运行状态
将前台脚本挂起到后台运行 按 Ctrl+Z 后执行 bg %1 先暂停前台任务,再让其在后台恢复为 Running
将后台任务调回前台 fg %1 重新占用当前终端窗口,可直接交互或按 Ctrl+C
终止指定后台任务 kill %1(强杀用 kill -9 %1) 注意作业号前必须带 %,否则会被当成 PID 为 1 的进程
断开SSH后保持后台运行 disown -h %1 为已用 & 启动的作业忽略挂断信号,防止关窗口退出
Linux怎么用&和jobs后台执行python
图 4:& 与 jobs 后台执行 Python 的核心操作速查与场景对比
相关专题:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。