在Linux启动脚本:如何testing启动“完成”?

我有一个在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答案:

  1. 当剧本被解雇时,为什么不能调整呢?
  2. 什么具体的服务/function必须准备好/为您的任务工作才能成功? X? 联网? 低系统负载? 文件共享挂载? 每件事都可以检查; “系统启动”过于笼统,可能包含任何或所有这些。

在启动过程中调用的最后一个文件是一个名为/etc/rc.local的文件。 您将放入该文件的任何内容都将在引导过程结束时运行。

一个手册的例子是http://www.netbsd.org/docs/guide/en/chap-rc.html

这是一个( 真正丑陋的 )解决scheme:

  1. 在脚本中使用这个testing:

     while [ ! -e "/etc/yes-we-up" ]; do sleep 10 done 
  2. 将此添加到/etc/rc.local的末尾:

     touch /etc/yes-we-up && chmod 644 /etc/yes-we-up 
  3. 创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