首先需要说明的的是,telinit 是init 的一个软连接。当系统起来后,init进程会占用PID 1,init程序会在入口处判断PID,如果不是1,就退出init处理程序,转而调用telinit.
if (!isinit) exit(telinit(p, argc, argv));, 作者这么设计,也就是为了让用户少敲三个字母而已。
好了,下面转入正题
telinit 或 init 命令
用途
语法
{
telinit |
init } {
0| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
a | b | c |h |
Q | q |
S | s | M | m |
N }
描述
init 命令初始化并控制进程。其首要任务是基于从文件
/etc/inittab 读入的记录启动进程。
/etc/inittab 文件通常请求
init 命令在用户可登录的每一行上运行
getty 命令。
init 命令控制系统所需的独立进程。
组成
init 命令的进程分派操作的主要进程是
/usr/sbin/getty。
/usr/sbin/getty 进程启动单独终端行。其它典型地由
init 命令分派的进程为守护进程和 shell。
telinit 命令将系统设置在一特定的运行级别上。运行级别是允许仅选中的进程组存在的软件配置。系统可以在下列的运行级别之一上:
下列参数也作为
init 命令的伪指令:
a、b、c、h | 告诉 init 命令只处理那些位于/etc/inittab 文件中,在运行级别字段中为 a、b、c 或h 的记录。这四个参数 a、b、c 和h 不是真正的运行级别。它们与运行级别的不同之处在于 init 命令无法要求整个系统进入运行级别a、b、c 或 h。 |
Q,q | 告诉 init 命令重新检查 /etc/inittab文件。 |
N | 发送信号阻止进程被重新派生。 |
当系统启动时,当根文件系统已在预初始化过程之中安装,则发生下列事件序列:
- init 命令作为启动过程的最后一步运行。
- init 试图读/etc/inittab 文件。
- 如果 /etc/inittab 文件存在, init 命令试图定位 /etc/inittab文件中的一个 initdefault 条目。
- 如果 /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 被调用。有两种方法可以退出维护运行级别:
在系统试图启动时,
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 值。
示例
文件
/etc/inittab | 指定 init 命令控制文件。 |
/etc/utmp | 指定登录用户的记录。 |
/var/adm/wtmp | 指定永久登录帐户文件。 |
/sbin/rc.boot | 指定预初始化命令文件。 |
/etc/rc | 指定初始化命令文件。 |
/etc/environment | 指定系统环境变量。 |
/dev/console | 指定控制台设备驱动程序。 |