화면을 종료하고 다시 시작하세요. 마침내 사기를 당했습니다!

화면을 종료하고 다시 시작하세요. 마침내 사기를 당했습니다!
#!/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

세트 -o 명사 세트
# set -o 오류 종료
# Trap 'echo "$LINENO 라인의 오류로 인해 중단되었습니다. 종료 코드: $&2' 오류
오류 추적 설정
set -o 파이프라인 실패

SCR="토끼"
스크립트="/홈/../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 라인의 오류로 인해 중단되었습니다. 종료 코드: $&2' 오류  

이 선은 당신의 작업을 방해하고 return 1있습니다find_screen function

  • close_screen함수 에서는 screen -S -X $target_screen quit약간의 수정이 필요합니다. 즉, screen -S $target_screen -X quit스위치를 해당 매개변수와 일치시키십시오.

if함수의 명령문은 결코 find_screentrue를 반환하지 않으므로 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 $SCRIPTSCRIPT 이름으로 새 스크린 세션을 만듭니다." 이것을 사용하여 -S스크린 세션 이름을 설정합니다. -t스크린 세션에 여러 창이 있을 수 있으므로 이를 창 이름 설정과 결합할 수 있습니다.screen -d -m -S $SCR -tWindowName1

관련 정보