如何在Linux中使用Init命令

Init是所有进程的父项。 它的主要作用是从存储在文件/ etc / inittab中的脚本创建进程(请参阅inittab (5))。 这个文件通常包含一些条目,这些条目会导致init在用户可以登录的每一行上生成getty s。它还控制任何特定系统所需的自治进程。

运行级别

运行级别是系统的软件配置,它只允许选定的一组进程存在。 每个这些运行级别由init产生的进程都在/ etc / inittab文件中定义。 Init可以处于八个运行级别之一: 0-6Ss 。 通过让特权用户运行telinit来改变运行级别,这会向init发送适当的信号,告诉它要更改哪个运行级别。

运行级别0,16被保留。 运行级别0用于暂停系统,运行级别6用于重新启动系统,运行级别1用于使系统进入单用户模式。 运行级别S不是直接使用,而是更多用于在进入运行级别1时执行的脚本。有关详细信息,请参阅关机 (8)和inittab (5)的联机帮助页。

运行级别7-9也是有效的,虽然没有真正记录。 这是因为“传统”Unix变体不使用它们。 如果你好奇,运行级别SS实际上是一样的。 在内部,它们是同一运行级别的别名。

引导

在调用init作为内核引导序列的最后一步之后,它会查找文件/ etc / inittab以查看是否存在initdefault类型的条目(请参阅inittab (5))。 initdefault项决定了系统的初始运行级别。 如果没有这样的入口(或者根本没有/ etc / inittab ),则必须在系统控制台输入运行级别。

运行级别Ss使系统进入单用户模式,不需要/ etc / inittab文件。 在单用户模式下,在/ dev / console上打开一个root shell。

当进入单用户模式时, init/etc/ioctl.save中读取控制台的ioctl (2)状态。 如果该文件不存在, init会9600波特率CLOCAL设置初始化该行。 当init离开单用户模式时,它将控制台的ioctl设置存储在该文件中,以便它可以在下一个单用户会话中重新使用它们。

首次进入多用户模式时, init会执行引导bootwait条目以允许在用户登录之前装载文件系统。然后处理与运行级别匹配的所有条目。

当启动一个新进程时, init首先检查文件/ etc / initscript是否存在。 如果有,它使用这个脚本来启动这个过程。

每次小孩终止时, init都会记录事实及其在/ var / run / utmp/ var / log / wtmp中死亡的原因,前提是这些文件存在。

更改运行级别

在它产生了所有指定的进程之后, init等待它的一个后代进程死掉,一个powerfail信号,或者直到telinit发信号通知它改变系统的运行级别。 当上述三种情况之一发生时,它会重新检查/ etc / inittab文件。 新条目可随时添加到此文件。 但是, init仍然会等待上述三种情况之一发生。 为了提供即时响应, telinit Qq命令可以唤醒init来重新检查/ etc / inittab文件。

如果init不处于单用户模式并收到一个powerfail信号(SIGPWR),它将读取文件/ etc / powerstatus 。 然后它根据这个文件的内容启动一个命令:

失败)

电力失效,UPS正在提供电力。 执行powerwaitpowerfail条目。

好)

电源已恢复,执行powerokwait条目。

低)

电源故障,UPS电量不足。 执行powerfailnow条目。

如果/ etc / powerstatus不存在或者包含其他任何内容,那么字母FOL ,init的行为就好像它读取了字母F.

不鼓励使用SIGPWR/ etc / powerstatus 。 有人想要与init交互应该使用/ dev / initctl控制通道 - 请参阅sysvinit包的源代码以获取更多关于此的文档。

init被要求改变运行级别时,它会发出警告信号SIGTERM给新运行级别中未定义的所有进程。 然后等待5秒钟,然后通过SIGKILL信号强制终止这些过程。 请注意, init假定所有这些进程(及其后代)都保留在init最初为其创建的同一个进程组中。 如果任何进程更改其进程组联系,它将不会收到这些信号。 这些过程需要单独终止。

使用telinit

/ sbin / telinit链接到/ sbin / init 。 它需要一个字符的参数并指示init执行适当的操作。 以下参数作为telinit的指令:

0,1,2,3,4,56

告诉init切换到指定的运行级别。

abc

告诉init只处理具有运行级别abc的那些/ etc / inittab文件条目。

Qq

告诉init重新检查/ etc / inittab文件。

SS

告诉init切换到单用户模式。

告诉init重新执行自己(保持状态)。 不会重新检查/ etc / inittab文件。 运行级别应该是Ss12345之一 ,否则请求会被默默忽略。

telinit还可以告诉init在发送进程SIGTERM和SIGKILL信号之间应该等待多长时间。 默认值是5秒,但可以使用-t sec选项更改。

telinit只能由具有适当权限的用户调用。

init二进制文件通过查看进程ID来检查它是init还是telinit ; 真正的init进程ID总是1由此可见 ,不用调用telinit,也可以使用init来代替快捷方式。