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它(尽管那里问题不大,但如果数字本身相等,则表示两个数字的字符串将相等)。

参见例如这里或者这里了解更多信息。

那就是说,在一位数字(REBOOT_REQUIRED不应超过 2)与“一位数字字符串”相比的简单情况下0,比较仍应按预期进行,因此您调用的从属脚本中可能会出现问题。

答案2

./您正在从(./$RESTORE_ETHERNET_NAME和)运行脚本./$RESTORE_WIFI_DRIVER,默认情况下服务的工作目录是根路径,这意味着该服务实际上从 运行脚本/,我猜它们不在那里。

您应该明确指定脚本的完整路径(而不是相对路径),或者 - 假设脚本与启动脚本位于同一位置 - 使用启动脚本的目录在脚本的完整路径中。您还可以将WorkingDirectory指令设置为脚本的位置,但这不是最佳解决方案,因为这意味着如果您的脚本以任何其他方式运行(而不是在服务下),它们仍然可能失败。

一般来说,在调试期间,您可以只运行echo reboot.这样机器就不会进入无限重启循环,并且您可以使用systemctl status <your service>.我想你会在那里看到类似的东西:

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

或者任何其他可以帮助您识别问题的错误。

当然,您的恢复脚本总是有可能无法按您的预期工作,无法解决问题,这当然会导致无限循环。

相关内容