如何让自托管GitHub Action启动的Tmux会话在任务完成后持久化?
问题分析
自托管GitHub Action的Job执行完成后,会终止其关联的所有进程组。你通过Job启动的Tmux会话默认属于该Job的进程组,当Job结束时,系统会向整个进程组发送SIGHUP信号,导致Tmux会话被强制终止——这就是任务运行时能看到会话,任务结束后会话消失的核心原因。
解决方案
你需要让Tmux会话脱离Job的进程组,避免被Job的清理流程终止,以下是几种可行的修改方式:
方式一:使用setsid隔离进程组
修改deployserver.sh中的Tmux启动命令,用setsid启动Tmux,让它创建独立的进程组:
#!/bin/bash echo $1 echo $2 DEPLOY_FOLDER=$1 CONTAINER_NAME=$2 # 使用setsid让tmux脱离当前进程组 setsid tmux new -d -s $CONTAINER_NAME -- pipenv run python server_web/run_server.py
方式二:结合nohup忽略SIGHUP信号
用nohup包裹Tmux启动命令,同时重定向输出避免占用Job的输出流:
#!/bin/bash echo $1 echo $2 DEPLOY_FOLDER=$1 CONTAINER_NAME=$2 # nohup忽略SIGHUP信号,并重定向输出到/dev/null nohup tmux new -d -s $CONTAINER_NAME -- pipenv run python server_web/run_server.py > /dev/null 2>&1 &
方式三:先启动独立的Tmux服务器
先启动脱离当前会话的Tmux服务器,再创建目标会话:
#!/bin/bash echo $1 echo $2 DEPLOY_FOLDER=$1 CONTAINER_NAME=$2 # 启动独立的tmux服务器,再创建会话 tmux start-server tmux new -d -s $CONTAINER_NAME -- pipenv run python server_web/run_server.py
验证方法
修改脚本后重新触发Workflow,在Job完成后登录到自托管Runner机器,执行tmux ls命令,即可看到持久化的Tmux会话。
内容的提问来源于stack exchange,提问作者Scott C.
相关产品推荐
相关产品推荐

