如何在GCP实例启动时同时运行两个tmux会话?
问题原因与解决方案
核心故障排查方向
- 会话内命令执行失败导致会话自动销毁
tmux默认配置下,会话启动时指定的命令执行结束后,会话会自动关闭。第二个会话大概率是启动成功后立刻因为命令报错退出,登录查看时已经销毁,才会出现只有第一个会话运行的假象。常见的报错原因包括:
开机启动脚本的默认工作目录为
/,如果第二个python脚本用了相对路径引用依赖、读取文件,会因为找不到资源直接报错退出
第二个脚本没有给切换的USERNAME用户开放读/执行权限,启动时触发权限错误直接退出
第二个脚本依赖的python库、系统依赖仅在手动登录的shell环境下可用,开机启动时环境变量缺失找不到依赖
tmux命令参数冲突
如果修改第二条命令时不小心重复了会话名,tmux会直接抛出duplicate session: xxx错误,第二条命令不会执行成功。tmux服务器初始化时序问题
第一条命令启动tmux服务器时如果存在延迟,第二条命令紧跟执行时可能偶发连接tmux服务器失败的情况。
修复方案
- 首先给所有tmux启动命令增加日志输出,同时替换所有脚本路径为绝对路径,方便定位错误,修改后的命令示例:
# 第一个会话 sudo -H -u USERNAME tmux new-session -d -s session1 'python3 /绝对路径/到/Main.py >> /var/log/tmux_session1.log 2>&1' # 第二个会话 sudo -H -u USERNAME tmux new-session -d -s session2 'python3 /绝对路径/到/Second.py >> /var/log/tmux_session2.log 2>&1'
- 如果存在时序问题,在两条命令中间增加1秒延迟:
sudo -H -u USERNAME tmux new-session -d -s session1 'python3 /绝对路径/到/Main.py >> /var/log/tmux_session1.log 2>&1' sleep 1 sudo -H -u USERNAME tmux new-session -d -s session2 'python3 /绝对路径/到/Second.py >> /var/log/tmux_session2.log 2>&1'
- 登录实例后查看对应日志即可定位报错原因:
cat /var/log/tmux_session2.log
可选调试手段
如果希望报错的会话不自动销毁,方便直接登录tmux查看实时错误,可以在启动会话前先设置tmux全局参数:
sudo -H -u USERNAME tmux set -g remain-on-exit on
调试完成后可以关闭该配置,避免无效会话占用资源。
内容的提问来源于stack exchange,提问作者SebastiaanTheCoder
相关产品推荐
相关产品推荐

