マシンの再起動後にスクリプトの実行を続行するにはどうすればよいですか?

マシンの再起動後にスクリプトの実行を続行するにはどうすればよいですか?

私はbashでシェルスクリプトを書いています。スクリプトのある時点で続行するには、システムを再起動する必要があることを検出します。以下を解放します。

sudo reboot

マシンが再び機能する場合、スクリプトはさらに作業を行う必要があります。このスクリプトで作業を続行するにはどうすればよいですか?

次回の再起動時に実行するシェルスクリプトをどこかに作成できるとします。そんなところはどこですか? cronに@rebootディレクティブがあるのを見ました。また、Apacheのようなサービスはupstartによって開始されることも知っています。これらの適切なメカニズムはありますか?では、どのようにトリガーしますか?

スクリプトは再起動するたびに実行するのではなく、一度だけ実行するだけです。したがって、次回の再起動時にのみ実行するか、実行後にそれ自体を削除できる場所に移動する必要があります。

この問題再起動後、アプリケーションの状態を保存する方法を尋ねます。私のスクリプトには状態があまりないため、管理できます。次の再起動後に実行するようにこのスクリプトを取得する方法だけを知りたいです。

私の特定のバージョンはUbuntu Linux 14.04です。元のスクリプトは、システム管理者がコマンドラインから起動します(cronで実行する代わりに)。

ベストアンサー1

システムに実際に持続する唯一のものはファイルです。これはあなたが使用する必要があります。これはinit.dスクリプトを使用するソリューションです。

次の(簡単な)スクリプトを考えてみましょう/etc/init.d/myupdate

#! /bin/sh

### BEGIN INIT INFO
# Provides:          myupdate
### END INIT INFO

PATH=/sbin:/bin:/usr/sbin:/usr/bin

case "$1" in
    start)
        /path/to/update/script
        ;;
    stop|restart|reload)
        ;;
esac

として有効にすると、起動時にupdate-rc.d myupdate defaultsこれstartが行われます。今すぐ更新スクリプトから再起動を要求したら、次のようにします。

touch /var/run/rebooting-for-updates
sudo reboot

このソリューションでは、更新スクリプトを2つの部分に分けることができます。

before_reboot(){
    # Do stuff
}

after_reboot(){
    # Do stuff
}

if [ -f /var/run/rebooting-for-updates ]; then
    after_reboot
    rm /var/run/rebooting-for-updates
    update-rc.d myupdate remove
else
    before_reboot
    touch /var/run/rebooting-for-updates
    update-rc.d myupdate defaults
    sudo reboot
fi

before_rebootコードセクションを実行してからファイルを作成して/var/run再起動します。起動時にスクリプトが再度呼び出されますが、ファイルが存在するため、after_reboot代わりに呼び出されますbefore_reboot

update-rc.droot権限が必要であることに注意してください。

ファイルを使用しないでください(スティーブン・オスターミュラー)のコメント:

このユーティリティに精通している場合は、ファイルの代わりにgetoptsオプションを使用することもできます。 initスクリプトでは、次のコマンドを使用してスクリプトを呼び出します。

/path/to/update/script -r

スクリプトでファイルの代わりにオプションを確認してください。オプションなしでスクリプトを一度呼び出すと、init.dは起動時にスクリプトを再呼び出しします。今回は-r

# Set AFTER_REBOOT according to options (-r).

if [ "x$AFTER_REBOOT" = "xyes" ]; then
    # After reboot
else
    # Before reboot
fi

オプション処理に関する詳細情報を見つけることができます。ここ(短いオプションのみ)。また、update-rc.d(他のコメントから)呼び出して、ワンタイムタスクにするためにスクリプトを編集しました。

おすすめ記事