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

如何搭配Python3使用TMUX在新终端中定时执行命令?

方案核心逻辑

tmux的窗口、会话是完全隔离的运行环境,通过tmux指令向指定新窗口发送执行命令时,命令只会在目标窗口运行,完全不会串到原有旧终端,刚好匹配需求。

前置依赖安装

先在终端执行对应命令安装需要的工具:

  • Debian/Ubuntu 系:sudo apt update && sudo apt install -y tmux python3
  • CentOS/RHEL 系:sudo dnf install -y tmux python3
  • MacOS(已安装Homebrew):brew install tmux python3
第一步:手动验证tmux基础逻辑

先手动敲3条命令熟悉操作,避免直接写脚本踩坑:

  1. 新建一个后台运行的tmux会话,不需要手动切进去:tmux new-session -d -s hourly_task
  2. 向这个会话的0号窗口发送测试命令执行:tmux send-keys -t hourly_task:0 "echo '测试任务运行' && date" Enter

    参数说明:hourly_task:0 精确指向你刚创建的会话的第0号窗口,命令只会发送到这个窗口执行,和你当前敲命令的终端完全无关

  3. 切到tmux会话里查看运行效果:tmux attach -t hourly_task,看完想退回原终端,按快捷键Ctrl+b后再按d即可,tmux会话会在后台持续运行不会中断。
第二步:编写Python3定时执行脚本

直接复制下面的代码,只需要修改开头配置区的内容即可,所有逻辑都做了封装,新手不需要改动核心代码:

import time
import subprocess
from datetime import datetime

# -------------------------- 仅需修改此区域配置 --------------------------
# 替换成你需要每小时执行的实际命令,例如 "python3 /home/xxx/your_own_script.py"
TARGET_COMMAND = "echo '每小时定时任务' && date"
# 自定义tmux会话名,一般不需要修改
TMUX_SESSION = "hourly_tasks"
# 任务执行间隔,单位秒,1小时对应3600秒
RUN_INTERVAL = 3600
# ----------------------------------------------------------------------

def init_tmux_session():
    """初始化后台tmux会话,已存在则跳过创建"""
    check_code = subprocess.run(
        ["tmux", "has-session", "-t", TMUX_SESSION],
        capture_output=True
    ).returncode
    if check_code != 0:
        subprocess.run(
            ["tmux", "new-session", "-d", "-s", TMUX_SESSION],
            capture_output=True
        )

def run_cmd_in_new_window():
    """在tmux会话中新建独立窗口,执行指定命令"""
    # 获取当前已有窗口数,新窗口按序号顺延,不与旧窗口冲突
    win_count = len(subprocess.run(
        ["tmux", "list-windows", "-t", TMUX_SESSION, "-F", "#{window_index}"],
        capture_output=True,
        text=True
    ).stdout.strip().split("\n"))
    # 创建新窗口
    subprocess.run(
        ["tmux", "new-window", "-t", f"{TMUX_SESSION}:{win_count}"],
        capture_output=True
    )
    # 向新窗口发送命令,触发执行
    subprocess.run(
        ["tmux", "send-keys", "-t", f"{TMUX_SESSION}:{win_count}", TARGET_COMMAND, "Enter"],
        capture_output=True
    )
    print(f"[{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}] 已在新窗口{win_count}执行任务")

if __name__ == "__main__":
    init_tmux_session()
    print(f"定时服务已启动,每{RUN_INTERVAL}秒执行一次任务")
    print(f"查看所有任务窗口请执行命令:tmux attach -t {TMUX_SESSION}")
    while True:
        run_cmd_in_new_window()
        time.sleep(RUN_INTERVAL)
第三步:脚本使用方法
  1. 把上面的代码保存为tmux_hourly_task.py,修改配置区的TARGET_COMMAND为你自己要跑的命令
  2. 执行命令启动脚本:python3 tmux_hourly_task.py
  3. 任何时候想查看所有历史任务的运行输出,执行tmux attach -t hourly_tasks即可进入tmux会话,按Ctrl+b后按n/p可切换不同时间创建的任务窗口
  4. 退出查看回到原终端,按Ctrl+b后按d即可,脚本和所有运行中的任务都会在后台保留,不会因为你关闭当前终端而中断
新手注意事项
  • 所有命令都是通过精确指定tmux会话+窗口编号发送的,只会在对应新窗口运行,绝对不会窜到你启动脚本的旧终端执行
  • 如果是远程连接服务器运行,断开ssh连接后任务不会停止,下次重连后执行attach命令就能重新看到所有窗口
  • 要停止定时任务,找到运行python脚本的终端按Ctrl+c即可;要清空所有tmux任务窗口,执行tmux kill-session -t hourly_tasks
  • 不要把需要手动交互输入的命令设为目标命令,否则新窗口会卡在等待输入的状态,需要你手动切进窗口操作

内容的提问来源于stack exchange,提问作者Noob python coder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 19:03:29