我有一个在 Debian 服务器启动期间运行的脚本。它运行得太早了,但我无法控制它何时启动。我可以使用以下命令强制脚本延迟其自身运行:
sleep 60
...或者,我可以尝试这个操作几次,如下所示:
TESTRUN=0
ACTIONWORKED=0
while [ $ACTIONWORKED -eq 0 ] && [ $TESTRUN -le 5 ]; do
# run the action i want
# quick test if it worked
# if yes, set ACTIONWORKED=1
# if no, sleep 10
# increment TESTRUN
done
有什么更好的方法来测试系统是否已准备就绪? 该脚本将在系统运行的其他时间运行,因此需要进行测试来区分“启动尚无法完成此操作”和“不启动,现在运行”状态。我不希望每次运行脚本时都要等待。
编辑: 感谢您到目前为止提出的想法。如果您有其他想法,请继续提供。
对于那些询问具体细节的人,我没有询问他们这个问题,而是专门收集与一般 Linux 启动过程相关的答案。
假设“完全启动”的系统已经显示登录提示(通过控制台、X 或其他)。
答案1
实际上,实现所需目的的最佳方法是在 SysV init 中的适当位置插入对脚本的调用。我建议您编写一个调用脚本的脚本,并劝说您的系统管理员将其安装在适当的位置。
编辑:好的,我刚刚阅读了您的另一个问题,我发现您说的是当有人插入设备时异步触发的脚本。您要做的就是检查运行级别,看它是否为 2(或者如果您更改了默认运行级别,则为 2;如果您希望在单用户模式下运行,则为 1)。如果我正确阅读了 Debian FAQ,则运行级别在启动完成之前不会更改为默认级别。
答案2
我会观察初始水平。
这应该可以让你开始了。
[[ `/sbin/runlevel | cut -d " " -f 2` == 5 ]] && echo "Ready"
高血压
答案3
在 Debian 系统上,您可以通过 /etc/rc?.d 中脚本开头的数字指定启动期间运行的顺序。因此,在该运行级别运行的第一个脚本将是 /etc/rc?.d/S01scriptname - 最后一个将是 /etc/rc?.d/S99scriptname。通过确保您的脚本是只有一个以 S99 为前缀,它将确保它最后运行。
或者,最后要做的一件事是打电话/etc/rc.local。通过从那里调用您的脚本,您可以确保它在启动过程结束时被调用。
另一个选择是测试文件 /etc/nologin- 在启动时创建,并在启动结束时删除。
话虽如此,我认为测试脚本是否有效的想法并不坏。这可以确保没有其他因素妨碍脚本正确运行。
答案4
您还可以使用@reboot作为时间,将其作为 cronjob 来运行。