You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Django2.0.2+Python3.6.3:如何启动新终端追踪触发的Shell脚本?

解决Django中启动Shell脚本并实时追踪输出的问题

我懂你的需求——在基于Python3.6.3和Django2.0.2的项目里,把Shell脚本作为后台子进程启动,同时能通过新终端实时查看那些耗时数小时任务的执行过程。下面给你几个实用的解决方案:

方案1:用gnome-terminal直接启动并保留终端

你之前尝试的gnome-terminal方向是对的,大概率是参数没配置到位,导致没法实时看输出或者终端直接退出。试试这个写法:

import subprocess

# 替换成你的实际脚本路径
script_path = "/path/to/your_target_script.sh"
# 启动gnome-terminal,执行脚本后保持终端不关闭
subprocess.Popen([
    "gnome-terminal",
    "--",
    "bash", "-c", f"{script_path}; exec bash"
], start_new_session=True)
  • -- 用来分隔gnome-terminal自身参数和要执行的命令,避免参数混淆
  • bash -c "{script_path}; exec bash" 先运行你的目标脚本,脚本执行完成后通过exec bash保持终端存活,方便你回溯输出
  • start_new_session=True 让终端进程脱离Django的父进程,避免Django重启或退出时影响脚本运行

如果脚本存在输出缓存问题(比如内容不会实时打印),可以在脚本开头加#!/bin/bash -x,或者把脚本执行命令改成stdbuf -o0 ./your_target_script.sh来禁用输出缓冲。

方案2:用tmux/screen(更适合远程服务器场景)

如果你的Django项目部署在远程服务器,或者没法使用图形化终端,tmux或screen是更稳妥的选择——它们能创建后台会话,你随时可以连接上去查看实时输出,哪怕断开SSH连接,任务也会继续在后台运行。

用tmux的操作步骤:

  1. 先确保服务器安装了tmux:sudo apt install tmux(Debian/Ubuntu)或yum install tmux(CentOS)
  2. 在Django代码中启动tmux后台会话:
import subprocess

script_path = "/path/to/your_target_script.sh"
# 创建名为task_session的后台会话,运行目标脚本
subprocess.Popen([
    "tmux", "new-session", "-d", "-s", "task_session",
    script_path
])
  1. 需要查看实时输出时,在终端执行:
tmux attach-session -t task_session
  1. 查看完毕后,按Ctrl+B再按D即可脱离会话,任务会继续在后台运行。

用screen的类似操作:

subprocess.Popen([
    "screen", "-dmS", "task_session", script_path
])

查看输出时执行:screen -r task_session

注意事项

  • 确保Django进程拥有执行目标脚本、创建终端/会话的权限
  • 生产环境尽量避免使用图形化终端工具(比如gnome-terminal),优先选择tmux/screen这类终端复用工具
  • 如果脚本输出仍不实时,检查脚本是否有输出缓冲逻辑,可通过将输出定向到stderr(echo "内容" >&2)或用stdbuf命令包装执行来解决

内容的提问来源于stack exchange,提问作者Sartorible

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 09:05:05