Feche e reinicie a tela - acaba sendo enganado!

2
#!/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 "$@"

Estou tentando criar um script que reinicie uma tela específica. Agora, o script inicia a tela, mas também cria outra tela com dois pontos 1234..randomName .

O objetivo do script é:

  • Verifique se existe uma tela
  • Se existir, feche a tela
  • crie uma nova sessão de tela com SCRIPT name
  • Se não existir, crie uma tela ainda!

Não tenho certeza do que está acontecendo ou porque não está funcionando. O que estou fazendo errado?

    
por kinx 01.03.2017 / 12:29

1 resposta

1

Eu consegui isso para trabalhar com algumas modificações:

#!/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" 

function 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 -S $SCR sh $SCRIPT
}

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

function find_screen {

    result=$(screen -ls "$1" | grep -o "^\s*[0-9]*\.$1[ "$'\t'"](" --color=NEVER -m 1 | grep -oh "[0-9]*\.$1" --color=NEVER -m 1)

    if [ -z $result ]; then
      echo "$1"
      return 1
    else
        echo $result
        return 0
    fi
}
target_screen=$(find_screen $SCR)
main "$@"

  • Comentei as duas linhas a seguir:
       set -o errexit  
       trap 'echo "Aborting due to errexit on line $LINENO. Exit code: $?" >&2' ERR  

Essas linhas estavam interferindo na sua declaração return 1 no find_screen function

  • Na função close_screen , screen -S -X $target_screen quit precisava de uma pequena modificação: screen -S $target_screen -X quit para corresponder aos comutadores com os respectivos parâmetros.

A instrução if na função find_screen nunca retornou true, então atualizei-a ligeiramente adicionando uma variável results , atribuindo-a à sua condição de teste original. A atualização resultante é a seguinte:

    result=$(screen -ls "$1" | grep -o "^\s*[0-9]*\.$1[ "$'\t'"](" --color=NEVER -m 1 | grep -oh "[0-9]*\.$1" --color=NEVER -m 1)

    if [ -z $result ]; then
      echo "$1"
      return 1
    else
        echo $result
        return 0
    fi

Outros itens

  • Se você deseja nomear sua tela com base na variável $ SCR, é necessário usar a opção -S , como em

screen -d -m -S $SCR

... e adicione quaisquer outros parâmetros e opções, conforme desejado.

  • Na função start_script , parece que você está tentando usar a opção -t , em vez de -S , em screen -d -m -t $SCR sh $SCRIPT - com base em sua descrição, " criar uma nova sessão de tela com nome de SCRIPT "você usaria -S para definir o nome da sessão de tela. Você pode combinar isso com -t para definir o nome da janela, pois você pode ter várias janelas em uma sessão de tela: screen -d -m -S $SCR -t WindowName1
por 06.03.2017 / 05:26