后台程序没有启动或fork进程自动退出---busybox init启动思考

我的busybox inittab有如下行:
ttyS1::sysinit:/etc/init.d/rcS
ttyS1::respawn:-/bin/sh

然后在rcS调用的启动进程脚本中,有文件S50update.sh:
upgrade_osd &

然后我发现启动过程中,upgrade_osd根本没有启动。
我到upgrade_osd的main中,fork全部过程,然后在S50update.sh:
upgrade_osd

然后发现启动了,但是又退出了,尽管我的upgrade_osd设计是不退出的。

后来了解busybox init的启动,尤其是inittab的描述,理解如下:
ttyS1::sysinit:/etc/init.d/rcS (其中sysinit表示启动是调用)
之后调用ttyS1::respawn:-/bin/sh
不是kill了之前的shell然后重新启动一个。

所以修改如下:
::sysinit:/etc/init.d/rcS
ttyS1::respawn:-/bin/sh


重要参考:
  如果存在/etc/inittab文件,Busybox init程序解析之,然后按照文件的只是创建各种子进程,否则使用默认的配置创建子进程。/etc/inittab文件中每个条目用来定义一个子进程,并确定它的启动方法,格式如下:
<id>:<runlevels>:<action>:<process>
<id>: 表示这个子进程要使用的控制台(即标准输入、标准输出、标准错误设备)。如果省略,则使用与init进
程一样的控制台;
<runlevels>: 对于Busybox init程序,没有意义,可以省略;
<action>: 表示init进程如何控制这个子进程,有8中取值:
sysinit, wait, once, respawn, askfirst, shutdown, restart, ctrlaltdel
<process>: 要执行的程序,可以是可执行程序,也可以是脚本,如果<process>字段前有“-”字符,这个程序
被称为“交互的”。
在/etc/inittab文件的控制下,init进程的行为总结如下:
1>在系统启动前期,init进程首先启动<action>为sysinit, wait, once的3类子进程
2>在系统正常启动期间,init进程首先启动<action>为respawn, askfirst的两类子进程,并监视它们,发现
某个子进程退出时重新启动它
3>在系统退出时,执行<action>为shutdown, restart, ctrlaltdel的3类子进程(之一或全部)。

如果根文件系统中没有/etc/inittab文件,Busybox init程序使用默认的inittab条目:
::sysinit:/etc/init.d/rcS
::askfirst:-/bin/sh
tty2::askfirst:-/bin/sh
tty3::askfirst:-/bin/sh
tty4::askfirst:-/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
::shutdown:/sbin/swapoff -a
::restart:/sbin/init
 

你可能感兴趣的:(职场,休闲,busybox)