如何搭配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条命令熟悉操作,避免直接写脚本踩坑:
- 新建一个后台运行的tmux会话,不需要手动切进去:
tmux new-session -d -s hourly_task - 向这个会话的0号窗口发送测试命令执行:
tmux send-keys -t hourly_task:0 "echo '测试任务运行' && date" Enter参数说明:
hourly_task:0精确指向你刚创建的会话的第0号窗口,命令只会发送到这个窗口执行,和你当前敲命令的终端完全无关 - 切到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)
第三步:脚本使用方法
- 把上面的代码保存为
tmux_hourly_task.py,修改配置区的TARGET_COMMAND为你自己要跑的命令 - 执行命令启动脚本:
python3 tmux_hourly_task.py - 任何时候想查看所有历史任务的运行输出,执行
tmux attach -t hourly_tasks即可进入tmux会话,按Ctrl+b后按n/p可切换不同时间创建的任务窗口 - 退出查看回到原终端,按
Ctrl+b后按d即可,脚本和所有运行中的任务都会在后台保留,不会因为你关闭当前终端而中断
新手注意事项
- 所有命令都是通过精确指定tmux会话+窗口编号发送的,只会在对应新窗口运行,绝对不会窜到你启动脚本的旧终端执行
- 如果是远程连接服务器运行,断开ssh连接后任务不会停止,下次重连后执行attach命令就能重新看到所有窗口
- 要停止定时任务,找到运行python脚本的终端按
Ctrl+c即可;要清空所有tmux任务窗口,执行tmux kill-session -t hourly_tasks - 不要把需要手动交互输入的命令设为目标命令,否则新窗口会卡在等待输入的状态,需要你手动切进窗口操作
内容的提问来源于stack exchange,提问作者Noob python coder
相关产品推荐
相关产品推荐

