Linux怎么用&和jobs后台执行python
详细介绍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次。
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参数和输出重定向。
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在子进程中异步执行该命令,不阻塞前台输入。
三、使用 jobs 命令查看后台Python任务
当一个或多个Python脚本在后台运行时,使用Shell内置的jobs命令可以查看当前终端会话管理的全部作业列表。推荐加上-l选项,同时显示每个作业对应的系统PID。
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表示脚本已正常执行完毕。
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,终端已被阻塞。按以下三步即可在不杀死进程的前提下将其转入后台运行:
- 在当前终端按下快捷键
Ctrl+Z:向当前前台Python进程发送SIGTSTP信号,将其暂停并挂起到后台。终端会提示[1]+ Stopped python3 process_data.py。 - 输入
jobs -l确认作业编号(假设为[1]),此时该Python进程处于Stopped暂停状态,代码并未继续往下跑。 - 输入
bg %1:向1号作业发送SIGCONT继续信号,使其在后台恢复为Running状态。
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暂停。
五、终止后台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信号:
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 |
为已用 & 启动的作业忽略挂断信号,防止关窗口退出 |
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













