我有一个在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
什么是testing系统准备好的更好方法? 系统运行时,脚本将在其他时间运行,因此需要进行testing来区分“引导 – 不能这样做”和“不引导 – 运行 – 现在”状态。 我不希望它每次脚本运行时都等待。
编辑:感谢迄今为止的想法。 如果你已经发布的东西有其他的select,请保持联系。
对于那些已经提出具体问题的人,我没有把他们的问题留在专门的问题上来收集与一般Linux引导过程相关的答案。
假设一个“完全启动”的系统提供了一个login提示符(通过控制台,X或其他)。
真正实现你想做的最好的方法就是在SysV init的适当位置插入一个对脚本的调用。 我build议你写一个脚本来调用你的脚本,然后哄骗你的系统pipe理员,直到他或她把它安装到适当的位置。
编辑:好吧,我刚刚读了你的其他问题,我看到你正在谈论的是一个脚本,是asynchronous开火,当有人插入设备。 你想要做的是检查运行级别,看看它是否是2(或者如果你已经改变了默认的运行级别,也是1,如果你想让它在单用户模式下运行)。如果我正在阅读Debian常见问题正确,运行级别不会更改为默认值,直到启动完成。
我会看到初始级别。
这应该让你开始..
[[ `/sbin/runlevel | cut -d " " -f 2` == 5 ]] && echo "Ready"
HTH
在debian系统上,你可以通过/etc/rc?.d脚本开始处的数字来指定引导过程中运行的命令。 因此,在运行级别运行的第一个脚本将是/etc/rc?.d/S01scriptname – 最后一个将是/etc/rc?.d/S99scriptname。 通过确保您的脚本是唯一以S99为前缀的脚本,它将确保它最后运行。
或者,最后要做的事情之一是调用/etc/rc.local 。 通过从那里调用脚本,可以确保在启动过程结束时调用它。
另一个select是testing文件/ etc / nologin – 它是在启动时创build的,最后被删除。
这就是说 – 我不认为你testing脚本是否工作的想法是不好的。 它确保没有任何东西能够正确运行脚本。
你可以在rc3.d下添加一个脚本。 将其称为S99local,它将在所有其他脚本之后运行。
脚本按照S01xx至S99xx的顺序执行。
你也可以使用@reboot作为cronjob来运行它。
你假设你需要看看系统是否“准备就绪”,但这是什么意思? 你需要什么function才能使这个脚本运行? networking是否需要启动并运行? X11是否必须有login用户? 直接检查这些条件,或者find一个更好的地方来安装当这些特定步骤完成时(即/ etc / network / interfaces或类似的postup节)将要执行的脚本。
两条信息将大大有助于find答案:
在启动过程中调用的最后一个文件是一个名为/etc/rc.local的文件。 您将放入该文件的任何内容都将在引导过程结束时运行。
这是一个( 真正丑陋的 )解决scheme:
在脚本中使用这个testing:
while [ ! -e "/etc/yes-we-up" ]; do sleep 10 done
将此添加到/etc/rc.local的末尾:
touch /etc/yes-we-up && chmod 644 /etc/yes-we-up
创build/etc/init.d/is-we-up ,
将它链接到/etc/rc0.d/K02is-we-up和/etc/rc6.d/K02is-we-up ,
并把它放在里面:
#!/bin/sh -e # no we ain't rm /etc/yes-we-up