在系统上,唯一真正持久的是文件。那几乎是您应该使用的。这是使用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
使用此解决方案,您可以将更新脚本分为两部分:
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特权。
不使用文件(来自Stephen Ostermiller的评论):
如果您熟悉该getopts
实用程序,则可能要使用选项而不是文件。在初始化脚本中,使用以下命令调用脚本:
/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
以保持这项一次性工作(来自另一条评论)。