ubutnu6.10以后启动进程upstart的介绍

本文介绍了 Upstart 这一基于事件的服务管理系统,包括如何编写 Upstart 的工作文件以定义服务的启动、停止条件及操作流程,同时提供了启动、停止服务的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文:http://www.diybl.com/course/6_system/linux/Linuxjs/200863/120877.html



upstart从Ubuntu6.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

结束后运行的脚本指定主进程终止或者被杀死后运行的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 yoursrun when another job stops by using stopped job.)另一个有用的工作事件是"started工作名"。(The other useful job event is startedjob.)(译者注:这段话的意思是说,一个工作的启动和停止也是事件。)

  你可以用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

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选项)
### 启动Ubuntu系统的详细流程 启动Ubuntu系统的过程可以分为多个关键阶段,每个阶段都涉及特定的操作和配置。以下是详细的启动流程说明: #### 1. BIOS/UEFI自检 在系统启动时,BIOS或UEFI负责对硬件进行初始化检查,并确定启动设备的优先级。通常情况下,硬盘是默认的启动设备,其中包含引导加载程序(Boot Loader)。 #### 2. 引导加载程序(Boot Loader) 引导加载程序如GRUB(Grand Unified Bootloader)位于主引导记录(MBR)中。它负责读取内存中的配置文件(如`grub.cfg`),并根据配置文件中的设置选择要启动的操作系统内核[^4]。 ```bash # GRUB配置文件路径 /etc/default/grub ``` #### 3. 内核加载 引导加载程序将控制权移交给Linux内核。内核位于`/boot`目录下,通常以`vmlinuz-<version>`的形式命名。内核初始化硬件驱动程序、建立内存映射,并准备进入用户空间[^4]。 #### 4. 系统初始化 在Ubuntu中,`init`进程是第一个被启动进程,其PID为1。从Ubuntu 6.10开始,传统的`init`系统被`upstart`取代,而从Ubuntu 15.04开始,`systemd`成为默认的初始化系统[^1]。 - **运行级别**:`init`进程会读取`/etc/inittab`文件(对于使用`sysvinit`的系统)或通过`systemd`管理的服务来确定运行级别。 - **初始化脚本**:执行一系列初始化脚本,包括但不限于以下内容: - `/etc/rc.d/rc.sysinit`:初始化基本系统环境,例如设置PATH变量、挂载文件系统等。 - `/etc/modules.conf`:加载必要的内核模块。 - `/etc/rc*.d/`:根据运行级别执行相应的启动脚本。 #### 5. 用户登录 完成上述步骤后,系统进入登录界面,等待用户输入用户名和密码。此时,`/bin/login`程序会被执行[^2]。 #### 6. 特殊情况:Live CD启动 如果从Live CD启动Ubuntu系统,可能会遇到某些服务无法正常启动的问题,例如`openssh-server`服务。在这种情况下,可以尝试以下方法解决: - 使用`aptitude`安装软件包,而不是`apt-get`,以避免依赖问题[^3]。 - 手动启动服务: ```bash sudo systemctl start ssh ``` ### 示例代码:检查和启动SSH服务 ```bash # 检查ssh服务状态 sudo systemctl status ssh # 如果未启动,则手动启动 sudo systemctl start ssh # 设置开机自启 sudo systemctl enable ssh ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值