특정 조건에서 다시 시작하는 Bash 스크립트

특정 조건에서 다시 시작하는 Bash 스크립트

두 개의 다른 bash 스크립트를 호출하고 조건이 일치하면 시스템을 재부팅하는 bash 스크립트를 만들었습니다. 조건은 다음과 같습니다: REBOOT_REQUIRED>0

#!/bin/bash

# Declare a variable used as counter in order to count the reboot requests.
declare -i REBOOT_REQUIRED=0

# Script List
RESTORE_ETHERNET_NAME='restore-eth-names.sh'
RESTORE_WIFI_DRIVER='restore-wifi-driver.sh'

#####################################
# Execute RestoreEthNames.sh script #
#####################################

echo -e "Performing Startup Checks"

chmod +x $RESTORE_ETHERNET_NAME
./$RESTORE_ETHERNET_NAME
# Store return code
RESTORE_ETHERNET_NAME_RET_CODE=$?

if [[ $RESTORE_ETHERNET_NAME_RET_CODE == 0 ]]
then
    echo -e "==> Ethernet Configuration: Ok"
else
    echo -e "==> Ethernet Configuration: Fixed"
    ((REBOOT_REQUIRED++))
fi

#######################################
# Execute RestoreWiFiDriver.sh script #
#######################################

chmod +x $RESTORE_WIFI_DRIVER
./$RESTORE_WIFI_DRIVER
# Store return code
RESTORE_WIFI_DRIVER_RET_CODE=$?

if [[ $RESTORE_WIFI_DRIVER_RET_CODE == 0 ]]
then
    echo -e "==> WiFi Driver: Ok"
else
    echo -e "==> WiFi Driver: Fixed"
    ((REBOOT_REQUIRED++))
fi

if [[ $REBOOT_REQUIRED > 0 ]]
then
    echo -e "System Reboot in 5 seconds"
    sleep 5
    reboot
fi

이 스크립트는 시스템 서비스를 추가하기 위해 다른 설치 스크립트를 사용하여 시작 시 실행됩니다.

################################################
# Create Service to execute scripts on startup #
################################################

if [ -e $SERVICE_FULL_PATH ]; then
   echo "File $SERVICE_FULL_PATH already exists!"
else
   echo -e "[Unit]\nDescription=Startup Script\n\n[Service]\nExecStart=$\/$SCRIPT_STARTUP_CHECKS\n\n[Install]\nWantedBy=default.target" >> $SERVICE_FULL_PATH
   chmod 664 $SERVICE_FULL_PATH
   
   # Enable the service
   systemctl enable $SERVICE_NAME
fi

서비스가 올바르게 생성되었으며 서비스가 활성화되었습니다.

문제는 PC가 재부팅 루프에 들어간다는 것입니다. 로그인 시 PC가 부팅되고 5초 후에 시스템이 계속 재부팅됩니다.

답변1

한 가지 문제는 문자열 비교 연산자( >)를 사용하고 있다는 것입니다. 이 연산자는 왼쪽 문자열이 다음과 같은지 확인합니다.사전순으로오른쪽 문자열보다 큽니다.

대신 산술 비교 연산자를 사용해야 합니다 -gt. -eq사용해야 하는 반환 코드 검사에도 마찬가지입니다 (문제는 적지만 숫자 자체가 동일하면 두 숫자를 나타내는 문자열도 동일합니다).

예를 들어 참조하십시오.여기또는여기더 많은 정보를 알고 싶습니다.

그 의미는, 한 자리 숫자( 2를 초과해서는 안 됨)를 "한 자리 문자열"과 REBOOT_REQUIRED비교하는 간단한 경우에는 0비교가 예상대로 작동해야 하므로 호출하는 슬레이브 스크립트에 문제가 있을 수 있습니다.

답변2

././$RESTORE_ETHERNET_NAME(and) 에서 스크립트를 실행하고 있습니다 ./$RESTORE_WIFI_DRIVER. 기본적으로 서비스의 작업 디렉터리는 루트 경로입니다. 이는 서비스가 실제로 에서 스크립트를 실행하고 있음을 의미합니다 /. 제 생각엔 루트 경로가 거기에 없는 것 같습니다.

상대 경로가 아닌 스크립트의 전체 경로를 명시적으로 지정해야 합니다. 또는 - 스크립트가 시작 스크립트와 동일한 위치에 있다고 가정 - 다음을 사용하십시오.시작 스크립트 디렉터리스크립트의 전체 경로에 있습니다. WorkingDirectory지시어를 스크립트 위치로 설정할 수도 있지만 이는 스크립트가 다른 방식(서비스 이외의)으로 실행되는 경우 여전히 실패할 수 있다는 의미이므로 최선의 솔루션은 아닙니다.

일반적으로 디버깅하는 동안 을 실행하면 됩니다 echo reboot. 이렇게 하면 머신이 무한 재부팅 루프에 빠지지 않고 다음과 systemctl status <your service>같은 내용을 볼 수 있습니다.

./restore-wifi-driver.sh: No such file or directory

또는 문제를 식별하는 데 도움이 될 수 있는 기타 오류.

물론 복구 스크립트가 예상대로 작동하지 않고 문제를 해결하지 못할 가능성이 항상 존재하며 이로 인해 무한 루프가 발생하게 됩니다.

관련 정보