关闭并重新启动屏幕 - 最终被骗了!

关闭并重新启动屏幕 - 最终被骗了!
#!/bin/bash

set -o nounset
set -o errexit
trap 'echo "Aborting due to errexit on line $LINENO. Exit code: $?" >&2' ERR
set -o errtrace
set -o pipefail

SCR="bunny"
SCRIPT="/home/../run.sh" 



main() {
    if find_screen $SCR >/dev/null; then
        close_screen
        start_script
    fi
}

function start_script {
    echo "Starting script with new screen"
    screen -d -m -t $SCR sh $SCRIPT
}

function close_screen {
    if find_screen $SCR >/dev/null; then
        echo "Found! Deleting $SCR"
        screen -S -X $target_screen quit
    fi
}

function find_screen {
    if screen -ls "$1" | grep -o "^\s*[0-9]*\.$1[ "$'\t'"](" --color=NEVER -m 1 | grep -oh "[0-9]*\.$1" --color=NEVER -m 1 -q >/dev/null; then
        screen -ls "$1" | grep -o "^\s*[0-9]*\.$1[ "$'\t'"](" --color=NEVER -m 1 | grep -oh "[0-9]*\.$1" --color=NEVER -m 1 2>/dev/null
        return 0
    else
        echo "$1"
        return 1
    fi
}
target_screen=$(find_screen $SCR)
main "$@"

我正在尝试创建一个重新启动特定屏幕的脚本。现在,脚本确实启动了屏幕,但它还创建了另一个带有两个点的屏幕1234..randomName

该脚本的目标是:

  • 检查屏幕是否存在
  • 如果存在,关闭屏幕
  • SCRIPT使用名称创建一个新的屏幕会话
  • 如果不存在,仍然创建屏幕!

不确定发生了什么或者为什么它不起作用。我究竟做错了什么?

答案1

我通过一些修改使它可以工作:

#!/bin/bash

set -o 名词集
# 设置-o errexit
# trap 'echo "由于 $LINENO 行上的 errexit 而中止。退出代码:$?" >&2' 错误
设置错误跟踪
设置-o管道故障

SCR=“兔子”
脚本=“/home/../run.sh”

函数主() {
    如果 find_screen $SCR >/dev/null;然后
        关闭屏幕
        启动脚本
}

函数开始脚本{
    echo“使用新屏幕启动脚本”
    屏幕-d -m -S $SCR sh $SCRIPT
}

函数关闭屏幕{
    如果 find_screen $SCR >/dev/null;然后
        echo“找到!删除$SCR”
        屏幕 -S $target_screen -X 退出
}

函数 find_screen {

    结果=$(screen -ls "$1" | grep -o "^\s*[0-9]*\.$1[ "$'\t'"](" --color=NEVER -m 1 | grep -哦“[0-9]*\.$1”--color=NEVER -m 1)

    if [ -z $结果 ];然后
      回显“$1”
      返回1
    别的
        回显$结果
        返回0
}
target_screen=$(find_screen $SCR)
主要“$@”

  • 我注释掉了以下两行:
       设置错误退出  
       trap 'echo“由于 $LINENO 行上的 errexit 而中止。退出代码:$?” >&2' 错误  

这些行干扰了您return 1find_screen function

  • close_screen功能中,screen -S -X $target_screen quit需要稍作修改:screen -S $target_screen -X quit将开关与相应的参数相匹配。

if函数中的语句永远find_screen不会返回 true,因此我通过添加一个results变量对其进行了轻微更新,并将其分配给原始测试条件。更新结果如下:

    结果=$(screen -ls "$1" | grep -o "^\s*[0-9]*\.$1[ "$'\t'"](" --color=NEVER -m 1 | grep -哦“[0-9]*\.$1”--color=NEVER -m 1)

    if [ -z $结果 ];然后
      回显“$1”
      返回1
    别的
        回显$结果
        返回0

其他项目

  • 如果您希望根据 $SCR 变量命名屏幕,则需要使用开关-S,如下所示

screen -d -m -S $SCR

...并根据需要添加任何其他参数和开关。

  • start_script函数中,看起来您正在尝试使用开关-t,而不是-S-
    screen -d -m -t $SCR sh $SCRIPT根据您的描述,“使用 SCRIPT 名称创建一个新的屏幕会话" 您将用于-S设置屏幕会话名称。您可以将其与-t设置窗口名称结合起来,因为屏幕会话中可能有多个窗口:screen -d -m -S $SCR -tWindowName1

相关内容