두 개의 다른 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
또는 문제를 식별하는 데 도움이 될 수 있는 기타 오류.
물론 복구 스크립트가 예상대로 작동하지 않고 문제를 해결하지 못할 가능성이 항상 존재하며 이로 인해 무한 루프가 발생하게 됩니다.