您的位置:首页 > 其它

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

2010-10-29 18:18 316 查看
我的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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: