我制作了一个 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
答案2
./
您正在从(./$RESTORE_ETHERNET_NAME
和)运行脚本./$RESTORE_WIFI_DRIVER
,默认情况下服务的工作目录是根路径,这意味着该服务实际上从 运行脚本/
,我猜它们不在那里。
您应该明确指定脚本的完整路径(而不是相对路径),或者 - 假设脚本与启动脚本位于同一位置 - 使用启动脚本的目录在脚本的完整路径中。您还可以将WorkingDirectory
指令设置为脚本的位置,但这不是最佳解决方案,因为这意味着如果您的脚本以任何其他方式运行(而不是在服务下),它们仍然可能失败。
一般来说,在调试期间,您可以只运行echo reboot
.这样机器就不会进入无限重启循环,并且您可以使用systemctl status <your service>
.我想你会在那里看到类似的东西:
./restore-wifi-driver.sh: No such file or directory
或者任何其他可以帮助您识别问题的错误。
当然,您的恢复脚本总是有可能无法按您的预期工作,无法解决问题,这当然会导致无限循环。