首先需要说明的的是,telinit 是init 的一个软连接。当系统起来后,init进程会占用PID 1,init程序会在入口处判断PID,如果不是1,就退出init处理程序,转而调用telinit.
if (!isinit) exit(telinit(p, argc, argv));, 作者这么设计,也就是为了让用户少敲三个字母而已。
好了,下面转入正题
telinit 或 init 命令
用途
语法
描述
init 命令初始化并控制进程。其首要任务是基于从文件
/etc/inittab 读入的记录启动进程。
/etc/inittab 文件通常请求
init 命令在用户可登录的每一行上运行
getty 命令。
init 命令控制系统所需的独立进程。
组成 init 命令的进程分派操作的主要进程是 /usr/sbin/getty。/usr/sbin/getty 进程启动单独终端行。其它典型地由init 命令分派的进程为守护进程和 shell。
链接到
init 命令的
telinit 命令,指引
init 命令的操作。
telinit 命令引用单字符参数并通过
kill 子例程发出
init 命令从而执行适当的操作。
telinit 命令将系统设置在一特定的运行级别上。运行级别是允许仅选中的进程组存在的软件配置。系统可以在下列的运行级别之一上:
0-9 |
告知 init 命令将系统放置在 0-9 的其中一个运行级别上。当init 命令请求运行级别在0-9 中的更改时,它中止所有当前运行级别上的进程然后重新启动与新运行级别关联的任何进程。 |
0-1 |
预留给操作系统供将来使用。 |
2 |
包含运行在多用户环境之中的所有终端进程和守护进程。在多用户环境中,/etc/inittab 文件被设置,所以init 命令为系统的每一个终端创建一个进程。控制台设备驱动程序也被设置在所有运行级别上运行,因此系统仅能在活动的控制台上运行。 |
3-9 |
可根据用户的偏好定义。 |
S、s、M、m |
告诉 init命令进入维护方式。当系统从另一运行级别进入维护方式,只有系统控制台被用作终端。 |
下列参数也作为 init 命令的伪指令:
a、b、c、h |
告诉 init 命令只处理那些位于/etc/inittab 文件中,在运行级别字段中为 a、b、c 或h 的记录。这四个参数 a、b、c 和h 不是真正的运行级别。它们与运行级别的不同之处在于 init 命令无法要求整个系统进入运行级别a、b、c 或 h。
当 init 命令在 /etc/inittab 文件中找到运行级别字段的值为 a、 b、 c 或 h 的记录时,它会启动此进程。然而,它不会杀死处于当前运行级别的任何进程;除了已经运行在当前的系统运行级别的进程外,还会启动在运行级别字段中值为 a、 b、 c 或 h 的进程。真正的运行级别与 a、 b、 c 或 h 的另一个 区别在于以 a、 b、 c 或 h 开始的进程不会在 init 命令更改运行级别时停止。有三种方式停止 a、 b、 c 或 h 进程:
- 在 Action 字段中输入 off。
- 删除整个对象。
- 用 init命令进入维护状态。
|
Q,q |
告诉 init 命令重新检查 /etc/inittab文件。 |
N |
发送信号阻止进程被重新派生。 |
当系统启动时,当根文件系统已在预初始化过程之中安装,则发生下列事件序列:
- init 命令作为启动过程的最后一步运行。
- init 试图读/etc/inittab 文件。
- 如果 /etc/inittab 文件存在, init 命令试图定位 /etc/inittab文件中的一个 initdefault 条目。
- 如果 initdefault 条目存在,init 命令用指定的运行级别作为初始系统运行级别。
- 如果 initdefault 条目不存在,init 命令请求用户从系统控制台(/dev/console)输入一个运行级别。
- 如果用户输入了 S,s,M 或 m运行级别,init命令进入维护运行级别。这些是仅有的不要求正确格式的/etc/inittab 文件的运行级别。
如果 /etc/inittab 文件不存在,init 命令缺省将系统置于维护运行级别。
init 命令每 60 秒重读/etc/inittab 文件。如果 /etc/inittab 自从init 命令上次读取它时发生了改变,/etc/inittab文件中的新命令在系统启动时执行。
如请求 init 命令改变运行级别,init 命令读 /etc/inittab 文件以识别应当存在于新运行级别的进程。 然后,init 命令取消所有不应该运行在新级别上的进程,并启动所有应该运行在新级别上的进程。
在这些运行级别的每一级别上由 init 命令运行的进程定义在文件 /etc/inittab 之中。通过让 root 用户运行telinit 命令来改变运行级别,该命令链接到init 命令。该用户运行的init 命令向在系统启动时初始化的原始init 命令发送适当的信号。缺省运行级别可通过修改/etc/inittab 文件中 initdefault 项的运行级别来更改。
在维护运行级别, /dev/console 控制台终端对读写开放。提示输入 root 密码。当成功输入 root 用户密码时,su 被调用。有两种方法可以退出维护运行级别:
- 如果 shell 终止了,init 命令要求一个新的运行级别。
或
- init(或telinit)命令可以用信号通知init 命令并强制其改变系统的运行级别。
在系统试图启动时,init 命令提示输入一个新运行级别(initdefault 为维护时)的明显失败的原因可能是终端控制台设备(/dev/console) 被转换到一个并非物理控制台的设备上。倘若如此,而您希望在物理控制台而非 /dev/console 上工作,可以通过按物理控制台设备上的 DEL(删除)键强制 init 命令转换到物理控制台。
当 init 命令提示输入一个新的运行级别,输入 0 到 9 中的任一位或以下任一字母 S、s、M 或m。如果输入的是 S 、s、M 或m,init命令以维护方式操作,其额外结果是:如果此前控制被强制转换到物理控制台,/dev/console 文件也被转换到该设备。init 命令生成一条消息到 /dev/console 文件事先已连接到的设备上。
如果您输入了 0 到 9 运行级别,init 命令进入相应的运行级别。init 命令拒绝任何其它输入并重新提示您输入正确值。 如果这是init 命令第一次进入任意运行级别而非维护级别,它搜索/etc/inittab 文件中的带boot 或 bootwait 关键字的条目。如果init 命令找到了这些关键字,它执行相应的任务,假如输入的运行级别与条目的运行级别相匹配的话。例如,如果init 命令找到 boot 关键字,它引导机器。系统的任意特定的初始化,诸如检测和安装文件系统,都发生在系统允许任何用户操作之前。然后init 命令扫描/etc/inittab 文件查找为该运行级别处理的所有条目。接着它继续 /etc/inittab 文件的正常处理。
运行级别 2 缺省定义为包含运行在多用户环境的所有终端进程和守护进程。在多用户环境中,/etc/inittab 文件被设置以使得init 命令为系统的每一终端创建进程。
对终端进程而言,shell 终止是因为一明确输入的文件结束符,或断开连接。当init 命令收到一个进程已中止的信号,它在 /etc/utmp 文件和 /var/adm/wtmp 文件之中记录该事实及其原因。/var/adm/wtmp 文件记录已启动的进程的历史。
要在 /etc/inittab 文件之中启动每一进程,init 命令等待其一后继过程停止,等待一电源故障信号 SIGPWR,或直到init 命令由init 或 telinit 命令发出以改变系统的运行级别。当上述三个条件之一发生时,init 命令重新检查/etc/inittab 文件。即使已经有新的条目添加到 /etc/inittab 文件,init 命令仍在等待三个条件之一的发生。为提供瞬时响应,请运行telinit -q 命令来重新检查/etc/inittab 文件。
如果 init 命令发现其连续在文件 /etc/inittab 中运行一个条目( 225 秒内超过 5 次),它假定在条目命令字符串中存在一个错误。然后它打印一个出错信息到控制台,并在系统出错日志中记录一个错误。发送该消息后,60 秒内该条目不运行。如果该错误继续发生,该命令将每 240 秒仅重新生成该条目 5 次。init 命令继续假定出错,直到该命令在时间间隔内 5 次不响应,或直到其收到一个用户的信号。init 命令仅在错误第一次出现时记录该错误。
当 telinit 命令请求init 命令改变运行级别,init 命令向当前运行级别内未定义的所有进程发送一个 SIGTERM信号。在以信号 SIGKILL 中止这些进程前,init 命令等待 20 秒。
如果 init 命令收到一个SIGPWR 信号,且不在维护方式下,它扫描 /etc/inittab 文件查找特定的电源故障条目。在任何其它进一步的进程运行之前,init 命令调用与这些条目关联的任务(如果运行级别允许的话)。按这个方法,无论何时系统遇到电源故障,init 命令都可以执行 清除和记录功能。需要注意的是,这些电源故障条目不应该使用最先初始化的设备。
环境
因为 init 命令是系统每个进程的终极祖先,系统的每一其它进程继承该init 命令的环境变量。作为其初始化序列的一部分,init 命令读/etc/environment 文件,并将该文件中发现的任一赋值复制到传递给其所有子进程的环境中。因为init 子进程在注册会话中不运行,它们不继承init 命令的 umask 设置。这些进程可以设置 umask 为任意它们所需要的值。/etc/inittab 文件中的由init 执行的命令使用init 的 ulimit 值而非 /etc/security/limits 中所给出的缺省值。结果为由命令行成功执行的命令在由init 调用时可能执行不正确。任何有特殊 ulimit 需要的命令应包含特定的操作以设置为所需要的ulimit 值。
示例
- 要请求 init 命令重新检查/etc/inittab 文件,输入:
- 要请求 init 命令进入维护方式,输入:
文件