为什么用 upstart 替代 sysvinit ..................................................................................................4
Upstart 的设计........................................................................................................................... 5
书写 job...................................................................................................................................... 6
事件(Events) ......................................................................................................................... 7
失败 Failure................................................................................................................................8
状态 States ..................................................................................................................................9
状态图-State Diagram..............................................................................................................10
注释.................................................................................................................................. 12
事件结构 .................................................................................................................................. 13
概要 Summary..................................................................................................................13
基本原理 Rationale..........................................................................................................13
用例 Use cases................................................................................................................. 13
范围 Scope....................................................................................................................... 13
设计 Design......................................................................................................................13
命名 Names.................................................................................................................... 13
参数 Arguments..............................................................................................................14
环境 Environment ...........................................................................................................15
Stanzas...................................................................................................................................... 15
exec...................................................................................................................................16
script................................................................................................................................. 16
pre-start.............................................................................................................................16
post-start........................................................................................................................... 17
pre-stop............................................................................................................................. 17
post-stop............................................................................................................................17
start................................................................................................................................... 17
stop....................................................................................................................................17
description........................................................................................................................ 17
author................................................................................................................................18
version.............................................................................................................................. 18
emits..................................................................................................................................18
daemon..............................................................................................................................18
respawn.............................................................................................................................18
service...............................................................................................................................19
instance............................................................................................................................. 19
pid..................................................................................................................................... 19
kill.....................................................................................................................................19
normal...............................................................................................................................20
console..............................................................................................................................20
env.....................................................................................................................................20
umask................................................................................................................................20
nice....................................................................................................................................20
limit ...................................................................................................................................21
chroot................................................................................................................................21
chdir.................................................................................................................................. 21
调试 upstart Debugging Upstart ...............................................................................................21
增加 upstart 的详细度 Increase Upstart Verbosity........................................................ 21
在 job 文件中添加永久的 log 入口 ................................................................................22
Initctl 命令 .......................................................................................................................22
启动问题 .................................................................................................................................. 22
英文文档 .................................................................................................................................. 23
Why change it?..............................................................................................................23
Design of upstart........................................................................................................24
States.................................................................................................................................26
State Diagram............................................................................................................... 27
Notes.................................................................................................................................29
Writing Jobs..............................................................................................................................30
Events....................................................................................................................................... 32
Failure.......................................................................................................................................33
States.........................................................................................................................................34
State Diagram ........................................................................................................................... 35
Notes.................................................................................................................................36
EventStructure.......................................................................................................................... 37
Summary...........................................................................................................................37
Rationale...........................................................................................................................37
Use cases...........................................................................................................................37
Scope................................................................................................................................ 38
Design...............................................................................................................................38
Implementation Code....................................................................................................... 40
Data preservation and migration...................................................................................... 41
Stanzas...................................................................................................................................... 41
exec...................................................................................................................................41
script................................................................................................................................. 41
pre-start.............................................................................................................................42
post-start........................................................................................................................... 42
pre-stop............................................................................................................................. 42
post-stop............................................................................................................................42
start................................................................................................................................... 42
stop....................................................................................................................................43
description........................................................................................................................ 43
author................................................................................................................................43
version.............................................................................................................................. 43
emits..................................................................................................................................43
daemon..............................................................................................................................44
respawn.............................................................................................................................44
service...............................................................................................................................44
instance............................................................................................................................. 44
pid..................................................................................................................................... 44
kill.....................................................................................................................................45
normal...............................................................................................................................45
console..............................................................................................................................45
env.....................................................................................................................................46
umask................................................................................................................................46
nice....................................................................................................................................46
limit ...................................................................................................................................46
chroot................................................................................................................................46
chdir.................................................................................................................................. 46
Debugging Upstart ....................................................................................................................47
Increase Upstart Verbosity................................................................................................47
Add Persistent Log Entries to Job Definition Files......................................................... 47
Initctl Commands............................................................................................................. 47
Boot Problems.................................................................................................................. 48
为什么用 upstart 替代 sysvinit
现在的 sysvinit 能够胜任固定集合的脚本按顺序执行的情况。但是随着 linux
与现代的计算机交互日益复杂(无可置疑的是 linux 对移动设备的支持比
windows 好),sysvnit 已经很难应付。
只要保证一定的启动顺序,老的方法就能够很好的工作。所以你能将 init script
放置在适当的时候,并且期望他工作的很好。典型的执行顺序需求如下:
在我们依据/etc/fstab 挂载相应设备之前,硬件设备必须被系统发现,初始化
和分区检测。
当我们尝试启动网络前网络设备必须被发现和初始化。
以前这种方式能够很好的工作,为什么现在不能胜任呢?最简单的答案是我们的
电脑变得越来越灵活。
在任何时候设备能够被插入和拔出。比如 usb 设备。
存储总线能够容许不确定数目的设备,所以他们必须扫描设备。这个操作是非阻
塞的。
为了节省电源消耗,直到扫描到设备时才上电。这就能保证有少许时间设备有空
闲状态。
网络设备能够在任何情况,任何时候被热插拔。
只有在固件被系统探测到,并且被使用的情况下才需要被加载。
只有在网络畅通的情况下才能 mount NFS 网络文件系统。
我们可以利用已经存在的系统 init,但是有可能引入很多 bug 和竞争条件。
所以我们设计了一个能够处理以上诸多问题的新系统 init。
我们设计的目标是:能够基予配置文件和探测硬件的结果动态的协调组织系
统的启动顺序。
Upstart 的设计
Upstart 是事件驱动的 init 守护进程。系统使停止的 job 启动或启动的 job 停
止产生事件。事件包括:
系统启动
根文件系统变为可写
块设备被添加到系统
文件系统被挂载
一个特定的时候或重复时间阶段
另外的 job 开始执行或执行完毕。
一个文件被修改
有很多文件在队列目录
探测到网络设备
默认路由被添加或删除
事实上,任何进程都可以通过控制套接字(由于安全限制)发送事件到 init 守
护进程,随意没有限制。
每个 job 都有一个生命周期,如图所示:
红颜色的状态(”waiting” and “running”)是静止状态。我们一般会希望 job
保持在那个状态,直到事件到达,从而使 job 进入下一个状态。
其他的状态是临时状态;它们允许 job 运行脚本为 job 本身的运行做准备
(starting),和进行善后处理(stoping)。标记为 respawned 的服务如果在
停止事件到达之前终止了,在进程重新运行之前它可能运行 shell 脚本。
(”respawning”).
Job 离开某个状态由于与他相关的进程终止或(被杀掉)和迁移到另外一个合适
的状态。绿色箭头指向 job 如果将要启动,红色箭头指向 job 如果停止。如果脚
本脚本返回非零状态,或者被杀死,这个 job 往往被停止。当主进程终止而且
job 不是 respawned,这个 job 也往往停止。
如上所述,init 守护进程产生事件或由其他的进程导致 job 启动或停止的产生
事件;收到手动请求启动或停止 job 产生事件。
Init 守护进程和其他进程之间是双向交互的,所以 job 的状态能够被查询,所
有 job 状态的改变能够被收到。
书写 job
在 init 脚本系统中,你必须自己些一个脚本,通常借助于辅助工具如
start-stop-daemon 。(/etc/init.d/XXX start or stop).而 Upstart 则直接负
责守护进程的启动、监视和停止。实现这些,你仅仅要做的是提供路径,参数和
可执行程序给你需要启动的进程。如
exec /usr/bin/dbus-daemon
许多 job 通常写成 shell 脚本,特别是一些耗时少,快捷的任务。你可以用 job
文件中直接使用 shell 脚本代码代替 exec 节段;从而避免写一个单独的文件让
后执行它。
script
echo /usr/share/apport/apport > /proc/sys/kernel/crashdump-helper
end script
往往我们不仅仅只是启动一个二进制服务程序然后使它按与其的工作;我们经常
需要在它启动之前运行一些准备的程序或在它终止之后运行一些“收尾“的程序。
为止,我们使用一些其它的形式的 shell 代码,它在程序执行前或执行后运行。
与 init 脚本不同,他们不需要自己启动和停止守护进程,而是通过 exec 脚本节
段自动运行。
pre-start script
mkdir -p /var/run/dbus
chown messagebus:messagebus /var/run/dbus
end script
post-stop script
rm -f /var/run/dbus/pid
end script
为了一致性,可以使用 pre-start exec and post-start exec 替代 以上 shell
scripts .
这对在程序执行后运行一些其它的程序很有用。例如,连接一个守护进程去决定
它是否准备好了响应请求。post-start script 或 post-start exec 按如下方
式使用:
post-start script
# wait for listen on port 80
while ! nc -q0 localhost 80 /dev/null 2>&1; do
sleep 1;
done
end script
而且它能够告知守护程序即将停止,或使它延迟一段时间。pre-stop script 或
pre-stop exec 按如下方式使用.
pre-stop script
# disable the queue, wait for it to become empty
fooctl disable
while fooq >/dev/null; do
sleep 1
done
end script
事件(Events)
Upstart0.3 的事件比以前版本的事件更加详细。事件仍然使用简单的字符串发
送给系统,但是现在的事件能够传递给 job 参数和环境变量。
initctl emit network-interface-up eth0 -DIFADDR=00:11:D8:98:1B:37
这个命令将输出所有这个事件引起的效应,而且直到 upstart 完全处理完这个
事件它不会终止。
上面的事件能够通过 job 里面的脚本检验参数和环境变量。
start on network-interface-up
script
[ $1 = lo ] && exit 0
grep -q $IFADDR /etc/network/blacklist && exit 0
# etc.
end script
或者直接使用 start 或 stop 节段:
start on block-device-added sda*
job 状态改变导致的事件在这个版本中也有所变化。在以前的版本中,job 和
event 共享同样的命名空间。这个容易不仅容易造成混乱,而且当意外的在一个
事件后命名 job 还会导致很多问题。
现在,最主要的两个事件是 started 和 stoped。他们分别指 job 完全执行完,
或完全被关闭。Job 的名字作为事件的参数。
start on started dbus
只有在 post-start 任务执行完之后 started 事件才会发出。所以 post-start 任
务能够延迟其外的 job 启动,因为在此之间它们不能够用连接上守护进程。
同样的,只有在 post-stop 任务完成后 stoped 事件才会发出。
另外的两个事件比较特别,它们是 starting 和 stoping 事件。它们特别的原因
在于 job 不容许被启动和停止直到事件被完全处理。
这意味着你有一个任务要执行,它必须在数据库服务器停止的阶段执行,但又必
须在真正停止之前。
start on stopping mysql
exec /usr/bin/backup-db.py
MySQL 将不会关闭直到备份完成。
这对那些彼此依赖的守护进程很有用。例如,HAL 和 DBUS,HAL 启动完毕必须要
有 DBUS 正在运行为条件,DBUS 只有在 HAL 终止后才能停止。HAL 的 job 可以如
下编写:
start on started dbus
stop on stopping dbus
同样,在 tomcat 已经安装的情况下,Apache 启动只有在 tomcat 正在运行为条
件,tomcat 只有在 apache 终止后才停止。
start on starting apache
stop on stopped apache
失败 Failure
所有的程序不能一如既往的运行成功。有时候,一些任务的 job 将会运行失败,
或者守护进程自己崩溃。Upstart 不仅仅能够使崩溃的程序自动重启,而且还会
通知给 job 一个带特殊失败参数的 stopping 和 stopped 事件。