上QQ阅读APP看书,第一时间看更新
1.4 init进程
init进程是用户空间的第一个进程,负责启动用户程序。Linux系统常用的init程序有sysvinit、busybox init、upstart、systemd和procd。本节选择sysvinit进行说明。sysvinit是UNIX系统5(System V)风格的init程序,启动配置文件是“/etc/inittab”,用来指定要执行的程序以及在哪些运行级别执行这些程序。文件“/etc/inittab”如下:
# inittab for SysV init # The default runlevel # Boot-time system configuration/initilization script. si::sysinit:/etc/rc.d/init.d/rc S # Runlevel 0 is halt. # Runlevel 1 is single-user. # Runlevels 2-5 are multi-user. # Runlevel 6 is reboot. c0:125:respawn:/bin/sh 10:0:once:/etc/rc.d/init.d/rc 0 11:1:once:/etc/rc.d/init.d/rc 1 12:2:once:/etc/rc.d/init.d/rc 2 13:3:once:/etc/rc.d/init.d/rc 3 14:4:once:/etc/rc.d/init.d/rc 4 15:5:once:/etc/rc.d/init.d/rc 5 16:6:once:/etc/rc.d/init.d/rc 6
配置行的格式:id:runlevels:action:process。
其中id是配置行的标识符,runlevel是运行级别,action是要执行的动作,process是要执行的程序。
sysvinit使用运行级别定义系统运行模式,分8个运行级别:前7个是数字0~6,第8个的名称是“S”或者“s”。有3个基本的运行级别,如表1.1所示。
表1.1 基本运行级别
不同的Linux发行版本对其他运行级别的定义不同,常见的定义如表1.2所示。
表1.2 其他运行级别
si::sysinit:/etc/rc.d/init.d/rc S
执行shell脚本“/etc/rc.d/init.d/rc”,参数是“S”。shell脚本rc将会遍历执行目录“/etc/rc.d/rcS.d”下的每个shell脚本,这些脚本用来初始化系统。
13:3:once:/etc/rc.d/init.d/rc 3
如果运行级别是3,那么执行shell脚本“/etc/rc.d/init.d/rc”,参数是“3”。shell脚本rc将会遍历执行目录“/etc/rc.d/rc3.d”下的每个shell脚本。
怎么让一个程序在设备启动的时候自动启动?写一个启动脚本,放在目录“/etc/rc.d/init.d”下,然后在目录“/etc/rc.d/rc3.d”下创建一个软链接,指向这个启动脚本。假设程序的名称是“hello.elf”,启动脚本如下:
#! /bin/sh PROG=hello.elf case "${1}" in start) /sbin/${PROG} & ;; stop) pkill ${PROG} ;; reload) ;; restart) ${0} stop sleep 1 ${0} start ;; status) ;; *) echo "Usage: ${0} {start|stop|reload|restart|status}" exit 1 ;; esac