システムでは、実際に永続的なのはファイルのみです。それはほとんどあなたが使用すべきものです。以下は、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
ルート権限が必要です。
ファイルを使用しない場合(Stephen Ostermillerのコメントより):
getopts
ユーティリティに精通している場合は、ファイルの代わりにオプションを使用できます。initスクリプトで、次を使用してスクリプトを呼び出します。
/path/to/update/script -r
スクリプトで、ファイルではなくオプションを確認します。オプションを指定せずにスクリプトを1回呼び出すと、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
これを1回限りのジョブ(別のコメントから)に保つための呼び出しでスクリプトを編集しました。