init
init是Linux系统操作中不可缺少的程序之一。
所谓的init进程,它是一个由内核启动的用户级进程。
内核自行启动(已经被载入内存,开始运行,并已初始化所有的设备驱动程序和数据结构等)之后,就通过启动一个用户级程序init的方式,完成引导进程。
所以,init始终是第一个进程(其进程编号始终为1)。
内核会在过去曾使用过init的几个地方查找它,它的正确位置(对Linux系统来说)是/sbin/init。
如果内核找不到init,它就会试着运行/bin/sh,如果运行失败,系统的启动也会失败。
什么是INIT:init是Linux系统操作中不可缺少的程序之一。
所谓的init进程,它是一个由内核启动的用户级进程。
内核自行启动(已经被载入内存,开始运行,并已初始化所有的设备驱动程序和数据结构等)之后,就通过启动一个用户级程序init的方式,完成引导进程。
所以,init始终是第一个进程(其进程编号始终为1)。
内核会在过去曾使用过init的几个地方查找它,它的正确位置(对Linux系统来说)是/sbin/init。
如果内核找不到init,它就会试着运行/bin/sh,如果运行失败,系统的启动也会失败。
二、运行级别那么,到底什么是运行级呢?简单的说,运行级就是操作系统当前正在运行的功能级别。
这个级别从1到6 ,具有不同的功能。
不同的运行级定义如下:(可以参考Red Hat Linux 里面的/etc/inittab)# 0 - 停机(千万不能把initdefault 设置为0 )# 1 - 单用户模式# 2 - 多用户,没有 NFS# 3 - 完全多用户模式(标准的运行级)# 4 - 没有用到# 5 - X11 (xwindow)# 6 - 重新启动(千万不要把initdefault 设置为6 )这些级别在/etc/inittab 文件里指定。
这个文件是init 程序寻找的主要文件,最先运行的服务是放在/etc/rc.d 目录下的文件。
在大多数的Linux 发行版本中,启动脚本都是位于 /etc/rc.d/init.d中的。
这些脚本被用ln 命令连接到 /etc/rc.d/rcn.d 目录。
(这里的n 就是运行级0-6)运行级别的配置是在/etc/inittab行内进行的,如下所示:12 : 2 : wait : / etc / init.d / rc 2第一个字段是一个任意指定的标签;第二个字段表示这一行适用于运行那个级别(这里是2);第三个字段表示进入运行级别时,init应该运行第四个字段内的命令一次,而且init应该等待该命令结束。
/etc/init.d/rc命令运行启动和终止输入以便进入运行级别2时所需的任何命令。
第四个字段中的命令执行设置运行级别时的一切“杂活”。
它启动已经没有运行的服务,终止不应该再在新运行级别内运行的服务。
根据Linux 版本的不同,采用的具体命令也不同,而且运行级别的配置也是有差别的。
init启动时,它会在/etc/inittab内查找一个代码行,这一行指定了默认的运行级别:id : 2 : initdefault :你可以要求init在启动时,进入非默认运行级别,这是通过为内核指定一个“single”或“emergency” 命令行参数来实现的。
比如说,内核命令行参数的指定可通过LILO来执行。
这样一来,你就可以选择单用户模式了(即运行级别1)。
系统正在运行时,telinit命令可更改运行级别。
运行级别发生变化时,init 就会从/etc/inittab运行相应的命令。
四、/etc/inittab中的特殊配置/etc/inittab中,有几个特殊的特性,允许init重新激活特殊事件。
这些特殊特性都是用第三个字段中的特殊关键字标记出来的。
比如:1. powerwait允许init在电源被切断时,关闭系统。
其前提是具有U P S和监视U P S并通知init电源已被切断的软件。
2. ctrlaltdel允许init在用户于控制台键盘上按下C t r l + A l t + D e l组合键时,重新启动系统。
注意,如果该系统放在一个公共场所,系统管理员可将C t r l + A l t + D e l组合键配置为别的行为,比如忽略等。
3. sysinit系统启动时准备运行的命令。
比如说,这个命令将清除/tmp。
上面列出的特殊关键字尚不完整。
其他的关键字及其使用详情,可参考你的inittab手册页。
五、在单用户模式下引导一个重要的运行级别就是单用户模式(运行级别1),该模式中,只有一个系统管理员使用特定的机器,而且尽可能少地运行系统服务,其中包含登录。
单用户模式对少数管理任务(比如在/usr分区上运行fsck)而言,是很有必要的,因为这需要卸载分区,但这是不可能的,除非所有的服务系统已被杀死。
一个正在运行的系统可以进入单用户模式,具体做法是利用init,请求运行级别1。
内核启动时,在内核命令行指定single或emergency关键字,就可进入运行级别1了。
内核同时也为init指定命令行, init从关键字得知自己不应该采用默认的运行级别(内核命令行的输入方式和你启动系统的方式有关)。
有时,以单用户模式进行启动是必要的,这样一来,用户在装入分区之前,或至少在装入分散的/usr分区之前,能手工运行fsck(在分散的文件系统上,任何活动都可能使其更为分散,所以应该尽可能地运行fsck)。
如果自动化的fsck在启动时失败了,启动脚本init的运行将自动进入单用户模式。
这样做是为了防止系统使用不连贯的文件系统,这个文件系统是f s c k不能自动修复的。
文件系统不连贯的现象极为少见,而且通常会导致硬盘的不连贯或实验性的内核释放,但最好能做到防患于未然。
由于安全上的考虑,在单用户模式下,启动外壳脚本之前,配置得当的系统会要求用户提供root密码。
否则,它会简单地为L I L O输入合适的一行代码,以r o o t的身份登录(当然,如果/etc/passwd已经由于文件系统的问题而不连贯了,就不适合这里的原则了,为对付这种情况,你最好随时准备一张启动盘)。
不同的运行级有不同的用处,也应该根据自己的不同情形来设置。
例如,如果丢失了root口令,那么可以让机器启动进入单用户状态。
在启动后的 lilo 提示符下输入:init=/bin/sh rw 使机器进入运行级1 ,并把 root 文件系统挂为读写。
他会跳过所有系统认证,让你可以使用passwd 程序来改变root口令,然后启动到一个新的运行级。
init进程描述init进程,它是内核启动的第一个用户级进程。
init有许多很重要的任务,比如象启动getty(用于用户登录)、实现运行级别、以及处理孤立进程。
本章解释了怎样配置init以及如何运用不同的运行级别。
对于Linux系统的运行来说,init程序是最基本的程序之一。
但你仍可以大部分的忽略它。
一个好的Linux发行版本通常随带有一个init的配置,这个配置适合于绝大多数系统的工作,在这样一些系统上不需要对init做任何事。
通常,只有你在碰到诸如串行终端挂住了、拨入(不是拨出)调制解调器、或者你希望改变缺省的运行级别时你才需要关心init。
当内核启动了自己之后(已被装入内存、已经开始运行、已经初始化了所有的设备驱动程序和数据结构等等),通过启动用户级程序init来完成引导进程的内核部分。
因此,init总是第一个进程(它的进程号总是1)。
内核在几个位置上来查寻init,这几个位置以前常用来放置init,但是init的最适当的位置(在Linux系统上)是/sbin/init。
如果内核没有找到init,它就会试着运行/bin/sh,如果还是失败了,那么系统的启动就宣告失败了。
当init开始运行,它通过执行一些管理任务来结束引导进程,例如检查文件系统、清理/tmp、启动各种服务以及为每个终端和虚拟控制台启动getty,在这些地方用户将登录系统。
在系统完全起来之后,init为每个用户已退出的终端重启getty(这样下一个用户就可以登录)。
init同样也收集孤立的进程:当一个进程启动了一个子进程并且在子进程之前终止了,这个子进程立刻成为init的子进程。
对于各种技术方面的原因来说这是很重要的,知道这些也是有好处的,因为这便于理解进程列表和进程树图。
init的变种很少。
绝大多数Linux 发行版本使用sysinit(由Miguel van Smoorenburg著),它是基于System V的init设计。
UNIX的BSD版本有一个不同的init。
最主要的不同在于运行级别:System V有而BSD没有(至少是传统上说)。
这种区别并不是主要的。
在此我们仅讨论sysvinit。
配置init以启动getty:/etc/inittab 文件当init启动后,init读取/etc/inittab配置文件。
当系统正在运行时,如果发出HUP信号,init会重读它;这个特性就使得对init的配置文件作过的更改不需要再重新启动系统就能起作用了。
/etc/inittab文件有点复杂。
我们将从配置getty行的简单情况说起。
etc/inittab中的行由四个冒号限定的域组成:id:runlevels:action:process下面对各个域进行了描述。
另外,/etc/inittab可以包含空行以及以数字符号(’#’)开始的行;这些行均被忽略。
id 这确定文件中的一行。
对于getty行来说,指定了它在其上运行的终端(设备文件名/dev/tty后面的字符)。
对于别的行来说,是没有意义的(除了有长度的限制),但它必须是唯一的。
runlevels 该行应考虑的运行级别。
运行级别以单个数字给出,没有分隔符。
action 对于该行应采取的动作,也即,respawn再次运行下一个域中的命令,当它存在时,或者仅运行一次。
process 要运行的命令。
为了在第一个虚拟终端上(/dev/tty1)运行getty、在所有的正规多用户运行级别中(2-5),应该写入下面这行:1:2345:respawn:/sbin/getty 9600 tty1第一个域指出这是对应于/dev/tty1的行。
第二个域说明它应用于运行级别2,3,4和5。
第三个域是说在命令退出之后,应被再次执行(因此,用户可以登录、退出并且再次登录)。
最后一个域是在第一个虚拟终端上运行getty的命令。
如果你需要给系统增加终端或者拨入调制解调器线路,你应该给/etc/inittab增加更多的行,每一行对应一个终端或一条拨入线。
详细信息,参见init、inittab以及getty的manual page。
如果一个命令运行时失败了,并且init配置成重运行它,它会使用许多的系统资源:init运行它、它失败了、init再运行它、再次失败等等,没完没了。
python中init的用法
python中init的用法Python中的init(或者__init__)是一个特殊方法,它被用来初始化新创建对象的状态。
这个方法在对象被创建之后立即调用,通常用于执行对象的初始化工作,例如初始化对象的属性或执行一些设定操作。
在本文中,我们将深入探讨init方法的用途、语法、参数和使用示例。
1. init方法的用途init方法是Python中一个非常重要的方法,它被用于定义在对象创建时需要执行的初始化操作。
在Python中,我们创建一个类,是为了创建一个新的数据类型,用于保存我们想要的数据,或者执行我们编写的代码。
对象的初始化是一项非常重要的任务,它决定了对象在实例化时的状态,而init方法正是用于完成这个任务的。
2. init方法的语法init方法是一个特殊的方法,因此它在定义时需要遵循Python的特殊规则。
在Python中,所有特殊方法都需要以双下划线(__)开头和结尾,init方法也不例外。
init 方法的完整语法如下所示:def __init__(self, <parameters>):<method body>在这个语法结构中,init方法以def关键字开头,后面是方法名__init__。
而在方法名后面紧接着的是self参数,这个参数代表了当前对象,init方法所接收的参数列表放在括号(<parameters>)中。
3. init方法的参数在init方法中,可以接收任意数量的参数。
通常第一个参数都是self,表示当前实例被创建的对象,其后的参数则是init方法所需要的参数。
下面我们列出了一些常见的init方法参数:- self:当前实例- *args:可变数量的参数列表- **kwargs:关键字参数列表下面我们将分别介绍这些参数的使用。
3.1 self参数self是一个Python中的特殊参数,它代表了当前实例对象。
在Python中,创建类之后,我们可以通过类来创建新的实例对象,而self参数则是类实例化对象的一个引用。
linux中init命令的具体解释
linux中init命令的具体解释linux中init命令的具体解释佳洲多用户,没有NFS(和级别3类似,会停止部分服务)#3完全多用户形式#4没有用到#5x11(Xwindow)#6重新启动(千万不要把initdefault设置为6)三、linux的init命令的六种形式简介6种形式中有两种是系统内定的:0:停止系统运行。
init0〈回车〉相当于halt〈回车〉。
6:重启系统。
init6〈回车〉相当于reboot〈回车〉。
假如你了解/etc/inittab文件,就千万不要把0设为缺省登录形式,否则你的Linux的运行就只能两点一线了mdash;mdash;开机larr;rarr;停机,或者是开机larr;rarr;重启的无限循环。
其他的4种形式实际上是由操作系统确定的。
假如你愿意修改Linux的源代码,你可以以定义这4种(甚至6种)形式的实际功能。
其实只要知道Linux发布厂商的约定就足够了,下面我们就以蓝点2.0为例,看看init的常用约定吧mdash;mdash;init1mdash;mdash;进入单用户形式。
这和开机是选择SafeMode是一样的,能够以root的权限对系统进行管理,但是不能进入图形形式,也不支持中文,声卡和网络服务等就更不用提了。
总之,它是系统可运行的最低软硬件配置。
它和Windows的安全形式是比拟类似的,但一个本质的差异:在于只要你在Linux下运行相应的命令,硬件设备是能够在这种形式下被驱动的。
例如只要你的光驱连线正确,一个mount/dev/cdrom命令,你的光盘内容就随时能够在/mnt/cdrom里读出来。
要注意的是这一形式的字符控制台不能支持中文,但进入Xwin仍然能看到蓝点漂亮的中文字体,输入法也完全没有问题。
init2mdash;mdash;进入无网络服务的多用户形式假如你的计算机根本没有连网,这个形式就跟普通形式一样了。
否则的话别人就不能通过网络www、ftp或telnet登录你的计算机了,但对与ping命令你的计算机还是会作出反响的。
java类的init方法
java类的init方法Java类的init方法是Java编程语言中常用的一个构造方法。
该方法是用来初始化Java类的实例成员变量的。
在本文中,我们将探讨Java类的init方法的作用、用法和示例。
1.给Java类的实例成员变量指定默认值;2.为Java类的实例成员变量赋初值;3.在Java类被实例化时执行一些初始化操作。
二、Java类的init方法的用法Java类的init方法的语法格式如下:public void init(){//初始化代码}在上述代码中,init方法是无参数方法(即不需要传入任何参数),且返回类型为void,因此该方法不具有任何返回值。
Java类的init方法也可以包含参数,如下所示:在上述代码中,init方法有两个int类型的参数a和b,这样可以在初始化时传入参数,进而定制化初始化过程。
1.初始化Java类的实例成员变量public class Person{private String name;private int age;public void init(){name = "Tom";age = 20;}//其他方法...}在上述代码中,我们定义了一个名为Person的类,并声明了两个实例成员变量name 和age。
在init方法中,我们将name设为"Tom",将age设为20,这样就为Person类的实例成员变量指定了默认值。
3.在Java类被实例化时执行一些初始化操作1.使用init方法时,需要先实例化Java类的对象,然后通过对象调用该方法;2.init方法在对象被创建时自动执行;3.可以在Java类的init方法中调用其他方法。
继续探讨Java类的init方法,我们可以了解到,init方法在Java编程中是一个非常有用的构造方法,特别是在实例化对象时执行一些初始化操作时非常重要。
除了上述提到的三种情况下使用init方法,我们还可以在Java类中扩展init方法的功能,例如:1.初始化时执行一些必要的检查在Java类的init方法中,我们可以添加一些必要的检查,例如判断传入的参数是否为空,或者根据输入的参数计算某些值。
类的init方法
类的init方法
在Python中,类的init方法是一种特殊的方法,它用于定义和初始化类的实例属性。
init方法是在类实例化时自动调用的,它的第一个参数通常为self,表示类的实例本身。
在init方法中,我们可以定义类的实例属性,并为其赋初值。
init方法的语法如下:
```
class MyClass:
def __init__(self, arg1, arg2, ...):
self.attr1 = arg1
self.attr2 = arg2
...
```
在这个例子中,我们定义了一个名为MyClass的类,并在其init 方法中定义了两个实例属性attr1和attr2。
在类实例化时,我们可以为这两个属性传入对应的参数值。
除了定义实例属性外,init方法还可以进行其他的初始化操作,例如打开文件、连接数据库等等。
在实例化过程中,这些操作可以在init方法中完成,从而使类的实例在生成时就具有所需的状态和数据。
总之,init方法是Python中类的重要特性之一,它为我们提供了一种方便的方式来定义和初始化类的实例属性和方法。
熟练掌握
init方法的使用,可以帮助我们更好地理解和应用面向对象编程的思想。
jvm中init方法
jvm中init方法JVM中的init方法JVM(Java Virtual Machine)是Java语言的核心运行环境,负责将Java源代码编译成字节码并执行。
在JVM中,init方法是一个重要的概念,它在对象被创建时被调用,用于完成对象的初始化工作。
本文将详细介绍JVM中的init方法,包括其作用、调用时机以及使用注意事项。
一、init方法的作用init方法的主要作用是完成对象的初始化工作,确保对象在被使用之前处于正确的状态。
通过init方法,我们可以进行一些必要的设置、变量的初始化、资源的加载等操作,以确保对象能够正确地执行其功能。
二、init方法的调用时机init方法在对象被创建时被调用,具体调用时机可以分为两种情况:静态初始化和实例初始化。
1. 静态初始化:当类被加载时,JVM会执行类的静态初始化代码,包括静态变量的初始化和静态代码块的执行。
在静态初始化完成后,JVM会调用类的静态init方法。
静态init方法是类的静态成员,只会被调用一次,在程序运行期间只会执行一次。
2. 实例初始化:当通过new关键字创建对象时,JVM会为该对象分配内存并调用对象的构造方法进行初始化。
在构造方法执行完成后,JVM会调用对象的init方法,完成对象的实例初始化工作。
与静态init方法不同,实例init方法是对象的实例成员,每个对象都会调用一次。
需要注意的是,init方法的调用时机是由JVM自动管理的,无需手动调用。
当对象被创建时,JVM会自动调用相应的init方法,确保对象的初始化工作得以完成。
三、init方法的使用注意事项在使用init方法时,需要注意以下几点:1. init方法不能被显式调用:init方法由JVM自动调用,无法直接在代码中显式调用。
因此,在编写代码时,不需要考虑是否调用init方法,只需在init方法中编写需要执行的初始化代码即可。
2. init方法不能被重写:init方法是由JVM自动调用的,无法被重写。
golang init 函数
golang init 函数Go语言中的init函数是一个特殊的函数,它没有参数也没有返回值。
它的作用是在程序启动时自动执行,无需显式调用。
init函数可以存在于任意一个包中,一个包中可以有多个init函数。
当一个包被引用时,其init函数会自动执行。
在init函数执行期间,不能对全局变量进行赋值操作。
init函数的主要作用有以下几点:1. 初始化全局变量:在init函数中,可以进行全局变量的初始化操作。
这样可以确保程序启动时,全局变量都有一个初始值,避免使用未初始化的变量而产生不可预料的问题。
2. 执行复杂初始化逻辑:在init函数中可以执行一些复杂的初始化逻辑,例如初始化数据库连接、加载配置文件等。
这些操作可能需要一些时间,如果在程序启动时才进行,可以提高程序的响应速度。
3. 注册:在init函数中可以注册一些需要被调用的函数,这些函数可以在程序启动时被自动调用。
这样可以方便地进行一些初始化工作,例如注册HTTP路由、注册消息队列消费者等。
示例代码如下所示:```gopackage mainimport ("fmt")var globalVariable intfunc init() {fmt.Println("This is the init function.")globalVariable = 10// 进行其他初始化操作}func main() {fmt.Println("This is the main function.")fmt.Println("Global variable:", globalVariable)}```上述代码中,通过init函数对全局变量globalVariable进行初始化。
在init函数执行期间,将globalVariable赋值为10。
在main函数中,可以直接访问到已初始化的globalVariable。
init 和 shutdown区别
4.init
init是所有进程的祖先﹐它的进程号始终为1﹐所以发送TERM信号给init
会终止所有的用户进程﹑守护进程等。shutdown 就是使用这种机制。init定
义了8个运行级别(runlevel),init 0为关机﹐init 1为重启。关于init可以
[-d] 不写wtmp纪录〔已包含在选项[-n]中〕。
[-f] 没有调用shutdown而强制关机或重启。
[-i] 关机〔或重启〕前﹐关掉所有的网络接口。
[-p] 该选项为缺省选项。就是关机时调用poweroff。
3.reboot
reboot的工作过程差不多跟halt一样﹐不过它是引发主机重启﹐而halt是
halt -p 就是在系统关闭后再关掉电源。
halt -p -f 等于直接拔电(不要试。后果自负)^ _^
我个人觉得用shutdown 还是比较安全的。
在linux下一些常用的关机/重启命令有shutdown、halt、reboot、及init,
它们都可以达到重启系统的目的,但每个命令的内部工作过程是不同的,通过本
态﹔这是预设的﹐假定没有-h也没有-r参数给shutdown。要想了解在停机
〔halt〕或者重新开机〔reboot〕过程中做了哪些动作﹐你可以在这个文
件/etc/inittab里看到这些runlevels相关的资料。
shutdown 参数说明:
[-t] 在改变到其它runlevel之前﹐告诉init多久以后关机。
存目前正在编辑的文档﹐而像处理邮件〔mail〕和新闻〔news〕的程序则可以
正常地离开等等。
shutdown执行它的工作是送信号〔signal〕给init程序﹐要求它改变
类的init方法
类的init方法
类的init方法指的是类的初始化方法,也称为构造方法。
在Python中,初始化方法的名称为__init__(),它是一个特殊的方法。
当一个类被实例化时,__init__()方法会被调用,用于初始化该实例的属性。
在初始化方法中,可以定义类的属性和默认值,也可以接受参数来初始化属性。
例如,我们定义一个Person类,它有name和age两个属性。
在初始化方法中,我们可以定义这两个属性的默认值,并通过参数来修改它们:
```
class Person:
def __init__(self, name='John', age=18):
= name
self.age = age
person1 = Person() # name默认为'John',age默认为18 person2 = Person('Lucy', 20) # name为'Lucy',age为20 ```
在上面的代码中,我们定义了一个Person类,并在初始化方法中定义了name和age两个属性的默认值。
当创建person1实例时,由于没有提供参数,因此name和age的值分别为默认值'John'和18;而创建person2实例时,我们提供了参数,因此name和age的值分别为'Lucy'和20。
总之,类的初始化方法__init__()是一个非常重要的方法,用于初始化类的属性。
在实例化一个类时,会自动调用该方法,并根据参数来初始化属性。
init进程1
init进程1----init启动过程init启动过程众所周知,Linux中的所有进程都是有init进程创建并运行的。
首先Linux内核启动,然后在用户空间中启动init进程,再启动其他系统进程。
在系统启动完成完成后,init将变为守护进程监视系统其他进程。
Android是基于Linux的操作系统,所以init也是Android系统中用户空间的第一个进程,它的进程号是1。
下面先简单的看一下init进程的启动过程。
@/kernel/goodfish/init/main.c[cpp]view plaincopyprint?1.static int __init kernel_init(void * unused)2.{3. /*4. * Wait until kthreadd is all set-up.5. */6. wait_for_completion(&kthreadd_done);7. /*8. * init can allocate pages on any node9. */10. set_mems_allowed(node_states[N_HIGH_MEMORY]);11. /*12. * init can run on any cpu.13. */14. set_cpus_allowed_ptr(current, cpu_all_mask);15.16. cad_pid = task_pid(current);17.18. smp_prepare_cpus(setup_max_cpus);19.20. do_pre_smp_initcalls();21. lockup_detector_init();22.23. smp_init();24. sched_init_smp();25.26. do_basic_setup();27.28. /* Open the /dev/console on the rootfs, this should never fail */29. if (sys_open((const char __user *) "/dev/console", O_RDWR, 0) < 0)30. printk(KERN_WARNING "Warning: unable to open an initial console.\n");31.32. (void) sys_dup(0);33. (void) sys_dup(0);34. /*35. * check if there is an early userspace init. If yes, let it do all36. * the work37. */38.39. if (!ramdisk_execute_command)40. ramdisk_execute_command = "/init";41.42. if (sys_access((const char __user *) ramdisk_execute_command, 0) != 0) {43. ramdisk_execute_command = NULL;44. prepare_namespace();45. }46.47. /*48. * Ok, we have completed the initial bootup, and49. * we're essentially up and running. Get rid of the50. * initmem segments and start the user-mode stuff..51. */52.53. init_post();54. return 0;55.}[cpp]view plaincopyprint?1./* This is a non __init function. Force it to be noinline otherwise gcc2. * makes it inline to init() and it becomes part of init.text section3. */4.static noinline int init_post(void)5.{6. /* need to finish all async __init code before freeing the memory */7. async_synchronize_full();8. free_initmem();9. mark_rodata_ro();10. system_state = SYSTEM_RUNNING;11. numa_default_policy();12.13.14. current->signal->flags |= SIGNAL_UNKILLABLE;15.16. if (ramdisk_execute_command) {17. run_init_process(ramdisk_execute_command);18. printk(KERN_WARNING "Failed to execute %s\n",19. ramdisk_execute_command);20. }21.22. /*23. * We try each of these until one succeeds.24. *25. * The Bourne shell can be used instead of init if we are26. * trying to recover a really broken machine.27. */28. if (execute_command) {29. run_init_process(execute_command);30. printk(KERN_WARNING "Failed to execute %s. Attempting "31. "defaults...\n", execute_command);32. }33. run_init_process("/sbin/init");34. run_init_process("/etc/init");35. run_init_process("/bin/init");36. run_init_process("/bin/sh");37.38. panic("No init found. Try passing init= option to kernel. "39. "See Linux Documentation/init.txt for guidance.");40.}[cpp]view plaincopyprint?1.static void run_init_process(const char *init_filename)2.{3. argv_init[0] = init_filename;4. kernel_execve(init_filename, argv_init, envp_init);5.}在init_post()中会判断execute_command是否为空,如果不为空则执行run_init_process 调用。
init rc加日志方法
init rc加日志方法
在Linux系统中,init是系统的第一个进程,它负责启动和管理系统中的所有其他进程。
init进程的配置文件通常是位于/etc目录下的init/rc文件,不同的Linux发行版可能会有不同的命名方式,比如Ubuntu使用的是upstart或者systemd。
要给init/rc添加日志方法,你可以使用syslog服务来记录系统日志信息。
syslog是一个系统日志服务,它可以帮助你收集、记录和管理系统的各种日志信息。
你可以在init/rc脚本中调用syslog服务来记录特定事件或者输出信息。
另一种方法是在init/rc脚本中直接调用logger命令来记录日志。
logger命令可以将指定的消息写入系统日志中,你可以在
init/rc脚本中使用logger命令来记录系统启动、关闭或者其他重要事件的日志信息。
此外,你还可以在init/rc脚本中使用echo命令将日志信息输出到特定的文件中,这样可以方便你查看和分析系统的运行日志。
总的来说,要给init/rc添加日志方法,你可以使用syslog服
务、logger命令或者echo命令来记录系统日志信息,这样可以帮助你更好地监控和管理系统的运行情况。
