总览

/sbin/init [ -a ] [ -s ] [ -b ] [ -z xxx ] [ 0123456Ss ]
/sbin/telinit [ -t 秒 ] [
0123456sSQqabcUu
]

描述

Init

Init 是所有进程的父进程。它的首要任务是从一个存储在文件 /etc/inittab (参阅
inittab(5))里面的脚本里创建进程。这个文件通常有一些令 init 在每条用户可登录的线上派生
getty 的记录.它同时也控制着各独特系统所要求的独立进程。

运行级别

所谓 运行级别 是一种系统软件环境配置,在此特定的环境中只允许某一组选定的进程存在。 init
给不同的运行级别派生的进程在 /etc/inittab 文件中定义。 Init 可以启动到8个不同的运行级别上:
0-6Ss。运行级别可以由超级用户通过 telinit
命令来转换,此命令可以将转换信号传递给 init,告诉它切换到哪个运行级别。

运行级别 01,和 6 为系统保留的专用运行级别。运行级别 0 用来关机,运行级别 6
用来重启计算机,运行级别 1 用来使计算机进入单用户模式。运行级别 S 不是给我们直接使用的,更多是为进入运行级别 1
时运行某些可执行脚本时被调用。如果想得到更多相关的信息,请参阅手册页 shutdown(8) 和
inittab(5)。

运行级别 7-9 虽然在文档中说明,但也可以使用。不使用它们的原因只是因为"传统" Unix 变种不使用这些运行级别。另外,运行级别 S
和运行级别 s 实际上是相同的,它们只是系统内同一运行级别的两个不同的别名而己。

系统引导

当系统内核引导到最后一步时, init 进程被启动,它会自动查找 /etc/inittab 文件,看看是否有类型为
initdefault (参阅 inittab(5))的记录. initdefault
记录决定系统初始运行级别。如果没有这条记录(或者根本就没有 /etc/inittab ),那么,你必须在系统控制台输入想要进入的运行级别。

运行级别 Ss 把系统带入单用户模式,此模式不需要 /etc/initttab 文件。单用户模式中,
/sbin/sulogin 会在 /dev/console 这个设备上打开。

当进入单用户模式后, init 会从文件 /etc/ioctl.save 中读取控制台的
ioctl(2) 状态。如果该文件不存在, init 则把线路设定为 9600 baud 并且带有
CLOCAL。当 init 退出单用户模式时,它会自当前的控制台的 ioctl 设置存储到这个文件供下次使用。

当第一次进入多用户模式时,init 会执行bootbootwait
记录以便在用户可以登录之前挂载文件系统。然后再执行相应运指定的各进程。

当启动一个新的进程时, init 会检查是否存在 /etc/initscript
文件。如果存在该文件,则使用该脚本来启动该进程。

如果系统中存在文件 /var/run/utmp/var/log/wtmp,那么当每个子进程终止时,init
会将终止信息和原因记录进这两个文件中。

改变运行级别

init 启动了所有指定的子进程后,它会不断地侦测系统进程情况,如:它的某个子进程被终止、电源失效、或由 telinit
发出的改变运行级别的信号。当它接受到以上的这些信号之一时,它会自动重新扫描 /etc/inittab
文件,并执行相应操作。所以,新的记录可以随时加入到此文件中。并且, init
仍然等待系统发出了上述信号。在更新了各种系统文件后,如果你希望得到即时的更新,你可以使用telinit Qq 命令来唤醒
init 让它即刻重新检测/etc/inittab 文件。

如果 init 不是在单用户模式并且接收到了一个电源失效信号(SIGPWR),它会读取文件
/etc/powerstatus,并执行该文件中指定的各种操作:

F(AIL)
电源失效,由 UPS 提供电力。执行 powerwaitpowerfail 记录。
O(K)
电源恢复,执行 powerokwait 记录。
L(OW)
电源失效并且 UPS 电压也太低。执行 powerfailnow 记录。

如果文件 /etc/powrestatus 不存在或其中的内容并不包含有以上所示的字母 FOL ,则
init 会当做读到了字母 F

我们不赞成使用 SIGPWR/etc/powerstatus 。有些用户希望与 init
进行交互,那么可以使用 /dev/initctl 控制通道。关于此点的描述请参阅 sysvinit 包的源代码。

init 得到更新运行级别的请求, init会向所有没有在新运行级别中定义的进程发送一个警告信号 SIGTERM 。在等待 5 秒钟之后,它会发出强制中断所有进程的运行的信号 SIGKILL 。注意, init 假设所有的这些进程(包括它们的后代)都仍然在
init 最初创建它们的同一进程组里。如果有任何进程改变了它们的进程组,那么它就收不到这些信号。这样的进程,你需要分别进行手工的终止。

TELINIT

/sbin/telinit 是一个到 /sbin/init 的软链接。它用一个单字符参数来通知
init 执行相应的操作。下面是相关的参数:

0,1,2,3,4,56
通知 init 将运行级别切换到指定的运行级别
a,b,c
告诉 init 只运行那些 /etc/inittab 文件中运行级别是 ab
c 的记录
Qq
通知 init 重新检测 /etc/inittab 文件
Ss
通知 init 将运行级别切换到单用户模式下
Uu
通知 init 自动重启(保留状态),此操作不会对文件/etc/inittab 进行重新检测。执行此操作时,运行级别必须处在
Ss12345 之一,否则,该请求将被忽略

telinit 还可以告诉 init 两次发送 SIGTERM 和 SIGKILL 信号的时间间隔。默认值是 5
秒,你可以通过使用 -t sec 的选项来修改。

telinit 只能由具有恰当权限的用户执行。

init 通过检查自己的 进程号 来判断自己是 init 还是 telinit ;真的
init 的进程号永远都是 1。从这一点来看,我们在调用 telinit 时也可以只使用 init
来少敲几个键.

环境变量

Init 为所有的子进程设定下列环境变量

PATH
/usr/local/sbin:/sbin:/bin:/usr/sbin:/usr/bin
INIT_VERSION
如名字表示的那样.在决定一个脚本是否直接来自 init 时很有用
RUNLEVEL
当前系统的运行级别
PREVLEVEL
前次运行的运行级别(仅当改变运行级别时有用)
CONSOLE
系统控制台。此变量是由内核继承而来,如果没有此环境变量的定义, init 会使用 /dev/console 做为默认的控制台

启动标志

在启动系统时可以通过引导管理器(比如,LILO)传递一些启动标志给 initInit 接受下面几个:

-s, S, single
以单用户模式启动系统。按这种模式启动时, /etc/inittab 需要被检查,并在单用户模式 shell 启动之前会执行引导 rc
脚本。
1-5
定义需要启动的运行级别
-b, emergency
不运行任何启动脚本而直接进入单用户模式 shell

-a, auto 如果用缺省命令行从内核引导(没有用户干预), LILO 引导管理器向命令行增加了单词 如果是这样的话,
init 把环境变量 请注意你不能将这个东西用于任何安全评测 - 用户当然可以在命令行上手工输入

-z xxx -z 参数被忽略.你可以用这个选项略微扩展命令行,这样它可以在堆栈里获得更多空间.然后 Init
就可以操作命令行,好让 ps(1) 显示当前运行级别.

接口

init监听 /dev 里的一个 fifo/dev/initctl,从中获取信息。
Telinit 也使用这些和 init 进行通信。该界面没有完整的文档。如果对 init 有兴趣,则可以学习 src/ 目录中
init 源文件包中的 initreq.h 文件。

信号

init 对以下信号产生响应

SIGHUP
当接收到该信号后,init会对 /etc/initrunlvl/var/log/inirunlvl
文件进行检查。如果这两个文件之一存在而且文件中有 ASCII 字符的运行级别, init 会转换到相应的新的运行级别。 此特性只用于向后兼容!
.通常的情况是该文件并不存在,所以 init 执行类似于 telinit q 这样的操作。
SIGUSR1
当接收到这个信号量,init 会关闭并重新打开它的控制 fifo,/dev/initctl。此操作对 /dev
被重新挂载后的启动脚本有用。
SIGINT
通常,当用户按了 CTRL-ALT-DEL 键后,内核会向 init 传递此信号。它所执行的操作与 ctrlaltdel 相同。
SIGWINCH
当键盘有 KeyboardSignal 按键按下时,内核向 init 传递此信号,它激活 kbrequest 动作.  

init, telinit - 进程处理初始化的更多相关文章

  1. init启动进程

    init启动进程需要读取()配置文件 1,启动init进程的配置文件是/etc/inittab 2,/etc/sysvinit是系统初始化用的   /sbin/init在核心完整的加载后,开始运行系统 ...

  2. pytorch系列 -- 9 pytorch nn.init 中实现的初始化函数 uniform, normal, const, Xavier, He initialization

    本文内容:1. Xavier 初始化2. nn.init 中各种初始化函数3. He 初始化 torch.init https://pytorch.org/docs/stable/nn.html#to ...

  3. 3.使用OGG进程进行初始化数据

    开始初始化数据的时候要满足下面的条件: 1.disable掉目标段表的外键约束 2.disable掉目标端表的触发器 3.删除目标段表的索引,加快初始化速度 4.目标端表结构创建完成 源端配置初始化抽 ...

  4. OPC客户端的进程安全初始化

    现场OPC客户端无法获取远程OPC Server列表,也无法连接OPC Server,经查调用CoCreateInstanceEx()创建IID_IOPCServerList接口正常,但调用IOPCS ...

  5. SharePoint利用HttpModule的Init方法实现全局初始化

    接上篇 我们知道,HttpRuntime中会对每一个Request创建一个HttpApplication对象(HttpApplicationFactory从一个HttpApplication池来拿). ...

  6. echarts.init 使用jq获取初始化对象

    var myChart = echarts.init($('#main')[0]);// 或者var myChart = echarts.init($('#main').get(0));

  7. Systemd初始化进程/RHEL 6系统中System V init命令与RHEL 7系统中systemctl命令的对比

    Linux操作系统的开机过程是这样的,即从BIOS开始,然后进入Boot Loader,再加载系统内核,然后内核进行初始化,最后启动初始化进程.初始化进程作为Linux系统的第一个进程,它需要完成Li ...

  8. Linux---从start_kernel到init进程启动

    “平安的祝福 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ” ini ...

  9. 实验三:gdb跟踪调试内核从start_kernel到init进程启动

    原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 如果我写的不好或者有误的地方请留言 ...

随机推荐

  1. axios的数据请求方式及跨域

    express 的三大功能:静态资源.路由.模板引擎 app.use(express.static('www')); 只要是创建这个静态的目录,这个 www 的静态目录里面的文件就可以被访问 数据的请 ...

  2. [论文理解] Attentional Pooling for Action Recognition

    Attentional Pooling for Action Recognition 简介 这是一篇NIPS的文章,文章亮点是对池化进行矩阵表示,使用二阶池的矩阵表示,并将权重矩阵进行低秩分解,从而使 ...

  3. vue问题四:富文本编辑器上传图片

    vue使用富文本编辑器上传图片: 我是用的是wangEditor 富文本编辑器 demo:http://www.wangeditor.com/ 1).安装依赖:npm install wangedit ...

  4. Python数据分析中Groupby用法之通过字典或Series进行分组

    在数据分析中有时候需要自己定义分组规则 这里简单介绍一下用一个字典实现分组 people=DataFrame( np.random.randn(5,5), columns=['a','b','c',' ...

  5. Netflix颠覆HR:我们只雇“成年人”

    员工的最佳福利,是与优秀者一起工作 ● Patty McCord / 文 李钊/译 担任Netflix的首席人才官时,我与CEO里德·黑斯廷斯一起做了一份127页的PPT,命名为<自由& ...

  6. harbor扩容

    1.参照文档  https://k8s.abcdocker.com/kubernetes_harbor.html 2.设置连接 ln到其他文件目录下

  7. java:容器/集合(Map(HashMap,TreeMap)Collection和Collections,(Collection-value();)

    *Map接口:采用是键值对的方式存放数据.无序 HashMap: *常见的实现类: *--HashMap:基于哈希表的 Map 接口的实现. *常用的构造方法: * HashMap()构造一个具有默认 ...

  8. 【MM系列】SAP SAP库龄报表逻辑理解

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]SAP SAP库龄报表逻辑理解   ...

  9. appium+python+安卓模拟器环境搭建和启动app实例

    本文主要介绍在windows环境下搭建app自动化测试环境,具体步骤如下: 1.下载安卓sdk,网上很多资源 2.下载并安装安卓模拟器,官网上有 删除bin文件下的adb.exe和nox_adb.ex ...

  10. mysql——触发器——前期整理笔记00

    一.触发器 触发器是由事件来出发某个动作.这些事件包括insert语句.update语句和delete语句. 当数据库系统执行这些事件时,就会激活触发器执行相应得动作. 触发器是有insert.upd ...