谷歌云VM启动脚本运行tmux并执行Python3脚本失败如何解决
问题原因
- 核心原因1:tmux 的
new-session命令后直接拼接执行命令时,只要该命令执行结束(不管是正常运行完成还是报错退出),tmux 会话就会自动销毁。你的 Python 脚本因为环境问题启动失败后,tmux 会话直接被关闭,所以你找不到对应的会话,也看不到报错信息。 - 核心原因2:启动脚本执行时属于非交互式 shell 环境,通过
sudo -u切换用户时不会自动加载该用户的.bashrc、.profile等配置文件,会出现以下异常:- 相对路径的脚本找不到
- Python 依赖的环境变量(比如 Telegram Bot Token、自定义模块路径)缺失
- 若你用了虚拟环境,虚拟环境也不会被激活
- 附加问题:你当前脚本的 shebang 行写法错误,缺少根路径斜杠,应为
#!/bin/bash。
可行解决方案
你可以改为先创建后台 tmux 会话,再通过 send-keys 向会话发送执行命令,既可以避免命令执行失败会话直接销毁,也方便后续排查报错。修改后的启动脚本参考如下:
#!/bin/bash # 替换为实际的用户名、会话名、脚本绝对路径 USER="你的实际用户名" SESSION="自定义tmux会话名" SCRIPT_PATH="/home/你的实际用户名/脚本所在目录/SCRIPT.py" # 先加载用户环境变量、切换到用户目录,避免路径问题 sudo -H -u $USER bash -c "cd ~ && source ~/.profile" # 新建空的后台tmux会话 sudo -H -u $USER tmux new-session -d -s $SESSION # 向tmux会话发送执行脚本的命令,追加回车触发执行 sudo -H -u $USER tmux send-keys -t $SESSION "python3 $SCRIPT_PATH" C-m
- 所有路径必须使用绝对路径,避免相对路径找不到文件的问题
- 如果你的 Python 脚本使用了虚拟环境,把
python3 $SCRIPT_PATH替换为虚拟环境 Python 的绝对路径即可,比如/home/你的用户名/venv/bin/python3 $SCRIPT_PATH - 若后续脚本还是运行异常,你可以SSH登录后执行
tmux a -t 你的会话名进入tmux会话,直接查看命令的报错输出排查问题
内容的提问来源于stack exchange,提问作者Eghan Dharmmabudhi
相关产品推荐
相关产品推荐

