我们如何防止 CTRL-C 屏幕终止?

How can we prevent CTRL-C from screen terminating?

我目前正在编写一个 bash 脚本,它将创建多个 shell 实例(使用 screen命令)并执行 子程序 问题 是当我试图中断子程序时,它也中断了屏幕实例。我已经在互联网上用 SIGINT 搜索了 trap 命令,但我真的不知道在这种情况下如何使用它。

这是我的代码,向您展示了如何创建屏幕:

#!/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 -dmS "$name" ./start.sh
        echo "$name CREATED AT $path"
        sleep 2
    else
        echo "SCREEN $name IS ALREADY CREATED"
    fi
done

你能帮我更多地找到解决办法吗?非常感谢您的宝贵时间。

您的每个屏幕实例都是针对 运行 单个命令 start.sh 创建的。当此命令终止时,例如当您中断它时,屏幕将完成其工作并终止。这样做的原因是屏幕 运行s shell 脚本直接在 non-interactive shell 中,而不是生成新的交互式 shell 和 运行宁那里。 如果你想 运行 start.sh 在每个屏幕的交互式 shell 中,你会做这样的事情:

screen -dmS "$name" /bin/bash -i
screen -S "$name" -X stuff "./start.sh^M"

^M 是必需的,因为它模拟在 shell 屏幕中按回车键。

如果你使用这个,那么当你在屏幕内中断一个脚本时,你仍然会留下一个交互式提示来处理你认为合适的。