私は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.d
root権限が必要であることに注意してください。
ファイルを使用しないでください(スティーブン・オスターミュラー)のコメント:
このユーティリティに精通している場合は、ファイルの代わりに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
(他のコメントから)呼び出して、ワンタイムタスクにするためにスクリプトを編集しました。