You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何防止CTRL-C终止screen实例?bash脚本场景技术求助

解决screen会话随子程序中断而终止的问题

这个问题的核心原因是:默认情况下,screen会话会在它启动的初始进程(也就是你的./start.sh)退出时自动终止。当你给start.sh发送SIGINT信号(比如按下Ctrl+C),脚本进程退出,screen也就跟着关闭了。下面给你两种可行的解决方案:

方案1:修改start.sh,捕获SIGINT信号

如果你有权限修改./start.sh,可以在脚本开头添加trap命令来处理SIGINT,避免进程直接退出。

比如,你可以选择忽略SIGINT信号(这样Ctrl+C不会终止start.sh):

#!/bin/bash
# 在脚本开头添加这行
trap '' SIGINT

# 原来的start.sh代码...

或者,你也可以定义收到SIGINT后的自定义处理逻辑(比如打印提示后继续运行):

#!/bin/bash
trap 'echo "警告:收到中断信号,程序将继续运行..."' SIGINT

# 原来的start.sh代码...

方案2:修改screen启动命令,让会话在start.sh退出后保持打开

如果你不想修改start.sh,可以调整screen的启动参数,让它在start.sh执行完毕后自动启动一个bash shell,这样screen会话就不会终止。

修改你bash脚本中的screen启动行:

# 替换原来的 screen -dmS "$name" ./start.sh
screen -dmS "$name" bash -c "./start.sh; exec bash"

这样,当start.sh因为SIGINT或其他原因退出后,screen会自动启动一个交互式bash,保持会话存活。之后你可以通过screen -r $name重新连接会话,检查日志或者重新启动start.sh。

完整修改后的脚本示例

这里是整合了方案2的完整脚本:

#!/bin/bash
#ALL PATHS ARE DECLARED HERE.
declare -A PATHS;
declare -a orders;
PATHS["proxy"]=/home/luna/proxy/HydraProxy;
orders+=( "proxy" )
PATHS["bot"]=/home/luna/bot;
orders+=( "bot" )
#LAUNCH SERVERS
SERVERS=/home/luna/servers
cd "$SERVERS"
for dir in */; do
    d=$(basename "$dir")
    PATHS["$d"]="$(realpath $dir)";
    orders+=( "$d" )
done
for name in "${orders[@]}"; do
    if ! screen -list | grep -q "$name"; then
        path="${PATHS[$name]}"
        cd "$path"
        # 修改这里的screen启动命令
        screen -dmS "$name" bash -c "./start.sh; exec bash"
        echo "$name CREATED AT $path"
        sleep 2
    else
        echo "SCREEN $name IS ALREADY CREATED"
    fi
done

内容的提问来源于stack exchange,提问作者Phindau

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 18:27:34