如何防止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
相关产品推荐
相关产品推荐

