特定の条件で再起動する Bash スクリプト

特定の条件で再起動する Bash スクリプト

2つの異なる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

1つの問題は、文字列比較演算子(>)を使用していることです。この演算子は、左側の文字列が次のようになっていることを確認します。アルファベット順右の文字列より大きい。

代わりに算術比較演算子を使用する必要があります-gt-eq使用する必要がある戻りコードのチェックにも同様です(問題は少なく、数字自体が同じであれば、2つの数字を表す文字列も同じです)。

たとえば、参照してください。ここまたはここより多くの情報を知りたいです。

その意味は、1桁の数字(2を超えてはいけません)を「1桁の文字列」と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

または、問題を特定するのに役立つ可能性がある他のエラー。

もちろん、回復スクリプトが期待どおりに機能せず、問題を解決できない可能性が常に存在し、これは無限ループを引き起こします。

関連情報