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 quitprecisava de uma pequena modificação:screen -S $target_screen -X quitpara 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, emscreen -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-Spara definir o nome da sessão de tela. Você pode combinar isso com-tpara definir o nome da janela, pois você pode ter várias janelas em uma sessão de tela:screen -d -m -S $SCR -tWindowName1