ubutnu6.10以后启动进程upstart的介绍
upstart从Ubuntu 6.10开始被引入Ubuntu,它是/sbin/init守护进程(daemon)的代替品,是基于事件的(event-based)。它在启动期间负责处理任务和服务的启动,系统关闭时关闭它们,并在系统运行时管理它们。我发现upstart的中文使用指南很少,就翻译了部分http: //upstart.ubuntu.com/getting-started.html,希望对大家有些帮助。1.编写工作(job)文件(工作文件用来指示upstart什么时候该做什么事)
一旦你启动和运行upstart,你会想要编写自己的工作文件。请记住工作文件的格式还未稳定,所以如果你更新了upstart,你可能要修改现有的文件。
/etc/event.d中的文件里定义了一些工作,每个工作的名字就是这个目录里的文件名。这些文件都是普通的文本文件,而且不是可执行的。
工作文件的格式把一个或多个的空格或跳格(tab)当作是空白,这些空白会被跳过,除非这些空白在单引号或双引号中。在引号中允许有换行,不过要在换行前加上反斜杠。注释行由#号起头,直到本行行尾。
①exec和script
所有的工作文件都必须要含有exec节(exec stanza)或者script节(script stanza)。它们指定这个工作运行什么文件。
你可以向exec传送可执行文件的路径和可选的参数。任何特殊字母(比如引号或美元符号'$')将被传送到shell来进行解释。 代码:
exec /bin/foo --opt -xyz foo bar
script则把脚本代码传送给/bin/sh执行。shell的-e选项将被使用,所以任何一个命令执行失败都将终止运行脚本。script节的最后一行为"end script"。 代码:
script
# do some stuff
if [ ... ]; then
...
fi
end script
②启动前运行的脚本和结束后运行的脚本pre-start script and post-stop script
在运行exec或者script指定的程序之前或者之后,你可以运行一些附加的shell代码。附加代码不是用来启动主进程的,实际上他们也不能启动主进程。附加代码是用来准备运行环境和进行清理工作的。
启动前运行的脚本指定主进程运行前所要执行的shell代码,跟script一样,所以任何一个命令执行失败都将终止运行脚本。它也以"end script"作为结束。 代码:
pre-start script
# prepare environment
mkdir -p /var/run/foo
end script
[page_break]
结束后运行的脚本指定主进程终止或者被杀死后运行的shell代码。任何一个命令执行失败都将终止运行脚本。它也以"end script"作为结束。 代码:
post-stop script
# clean up
rm -rf /var/run/foo
end script
③start on和stop on
你的工作现在可以由系统管理员手动的启动和停止,然而,你也想要在事件发生时自动启动和停止一些工作。
upstart发出(emit)的主要事件是startup。这个事件在机器第一次启动(没有可写的文件系统或网络)时发出。如果你使用upstart的工作文件范例,你还会有运行级X事件,X是0到6或者S。工作将与指定运行级的init脚本一起运行。
其他工作可以在它们运行时生成事件。当另一个工作停止后你可以用"stopped 工作名"运行自己的工作。(you can have yours run when another job stops by using stopped job.)另一个有用的工作事件是"started 工作名"。(The other useful job event is started job.)(译者注:这段话的意思是说,一个工作的启动和停止也是事件。)
你可以用start on列出一些事件,表明发出这些事件时你想要启动这个工作,也可以用stop on来指明发出某些事件时你想要停止这个工作。 代码:
start on startup
start on runlevel 2
start on runlevel 3
start on stopped rcS
start on started tty1
(译者注:不知道是不是水平有限,上面的东西翻译得乱七八糟。其实说白了很简单的,假如一个工作文件包含了上面这段代码,那么这个工作会在 "startup","runlevel 2","runlevel 3","tty1启动","rcS停止"这些事件发生时运行。)
④控制台(console)
通过使用console节,你可以改变设置指定工作将信息输出到哪里,从哪里获得输入。console节你可以指定下列参数之一:output(从 /dev/console获得输入输出);owner(输出和Control-C发送给主进程) ;none(默认参数,输入输出指定到/dev/null)。 代码:
exec echo example
console output
[page_break]
2.工作控制(在终端中对工作进行控制)
①start和stop命令
在终端中运行start和stop命令,可以手动启动和停止工作,这两个命令通常被安装到/sbin。他们的参数是工作名,输出状态的改变 代码:
# start tty1
tty1 (start) running, process 7490 active
# stop tty1
tty1 (stop) running, process 7490 killed
②status命令
可以用status命令查询任意工作的状态。status也被安装在/sbin。它使用工作名作为命令行参数,输出每个工作的状态。 代码:
# status tty1
tty1 (stop) waiting
# start tty1
tty1 (start) running, process 4418
# status tty1
tty1 (start) running, process 4418
输出由以下部分组成:工作名 (最后被启动还是被停止) 当前状态, 进程id。
③initctl list命令
所有工作的列表和它们的状态可以用initctl list命令获得。 代码:
# initctl list
control-alt-delete (stop) waiting
logd (start) running, process 2347
rc-default (stop) waiting
rc0 (stop) waiting
rc0-halt (stop) waiting
rc0-poweroff (stop) waiting
rc1 (stop) waiting
rc2 (stop) waiting
rc3 (stop) waiting
rc4 (stop) waiting
rc5 (stop) waiting
rc6 (stop) waiting
rcS (stop) waiting
rcS-sulogin (stop) waiting
sulogin (stop) waiting
tty1 (start) running, process 4418
tty2 (start) running, process 7367
tty3 (start) running, process 7368
tty4 (start) running, process 7369
tty5 (start) running, process 7370
tty6 (start) running, process 7371
④initctl emit命令
自定义事件可以由initctl emit命令发出。所有由这个事件启动或停止的工作都会被影响到,假设有下面这个工作: 代码:
on bounce
exec echo --Bounced--
console output
下面这个命令会执行这个工作: 代码:
# initctl emit bounce
--Bounced--
事件可以带有参数(在emit命令中传递)和环境变量(使用-e选项)