Google Cloud实例startup-script中启动tmux会话不生效如何解决
问题根因
- tmux默认开启了
exit-unattached配置,当启动脚本作为父进程执行结束退出后,没有任何会话附着的tmux server会自动终止,连带你启动的所有tmux窗口内的命令都会被杀掉 - 启动脚本运行在非登录、非交互的shell环境下,PATH环境变量和你登录实例时的环境不一致,
pachctl、python、npx等命令可能因为路径未配置找不到,执行失败后tmux窗口会默认直接销毁,没有日志留存 - 依赖的目录、权限、认证配置缺失,比如pachctl需要的认证文件、服务运行的目录不存在,都会导致命令执行失败退出,且没有排错依据
解决方案
方案1:保留tmux的修改方式
先在实例内执行which pachctl、which python3、which npx获取三个命令的绝对路径,替换到下面脚本对应的位置,同时添加日志输出和tmux保活配置:
#! /bin/bash # 提前创建依赖目录和日志目录 mkdir -p /var/data_vis/pfs /var/log/startup_service # 补全PATH避免命令找不到 export PATH="/usr/local/bin:/usr/bin:/bin:/your/custom/path:$PATH" # 启动tmux并禁用无附着时自动退出的配置 tmux start-server tmux set -g exit-unattached off # 启动每个会话时开启窗口保留,同时把输出重定向到日志 tmux new -d -s data_vis_pfs '/your/path/to/pachctl mount /var/data_vis/pfs 2>&1 | tee /var/log/startup_service/pfs.log' tmux set -t data_vis_pfs remain-on-exit on tmux new -d -s data_vis_server 'cd /var/data_vis/server/ && /your/path/to/python3 ./index.py 2>&1 | tee /var/log/startup_service/server.log' tmux set -t data_vis_server remain-on-exit on tmux new -d -s data_vis_client 'cd /var/data_vis/client/ && /your/path/to/npx serve -l 3001 -s build 2>&1 | tee /var/log/startup_service/client.log' tmux set -t data_vis_client remain-on-exit on
排错方式:
实例启动后执行sudo tmux ls查看会话是否存在,存在的话执行sudo tmux attach -t 会话名即可查看窗口内的报错;如果会话不存在直接查看/var/log/startup_service/下的对应日志即可定位问题。
方案2:不用tmux的更简单方案
如果你用tmux只是为了后台保活服务,完全可以直接用nohup把命令丢后台运行,适配启动脚本的环境,不会有tmux的兼容性问题:
#! /bin/bash mkdir -p /var/data_vis/pfs /var/log/startup_service export PATH="/usr/local/bin:/usr/bin:/bin:/your/custom/path:$PATH" # 后台运行pachctl挂载 nohup /your/path/to/pachctl mount /var/data_vis/pfs > /var/log/startup_service/pfs.log 2>&1 & # 后台运行Python服务 cd /var/data_vis/server/ && nohup /your/path/to/python3 ./index.py > /var/log/startup_service/server.log 2>&1 & # 后台运行前端服务 cd /var/data_vis/client/ && nohup /your/path/to/npx serve -l 3001 -s build > /var/log/startup_service/client.log 2>&1 &
额外注意项
- pachctl需要认证配置,确认root用户下是否存在
~/.pachctl/config配置文件,如果配置在其他用户目录下,需要在脚本中提前export PACH_CONFIG=/path/to/your/pachctl/config - 确认所有服务依赖的目录、文件的权限,root用户是否有读写执行权限
内容的提问来源于stack exchange,提问作者binarymind
相关产品推荐
相关产品推荐

