#!/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_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 -t
WindowName1