当前位置: 首页 > 工具软件 > Upstart > 使用案例 >

Upstart笔记(by quqi99)

范浩宕
2023-12-01

作者:张华  发表于:2015-04-17
版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明

http://blog.csdn.net/quqi99 )

UpStart, 用于动态可插拨服务,基于事件机制,主要概念是job和event,等待event的到来,然后执行一个job.
job可以是task job(定时任务), service job(后台服务进程), abstract job(内部使用)三种。
job按其他分类方法也可以分为session job(用户会话,即用户从远客或本地登入直到退出),system job(系统的初始化,如挂载文件)。
job是有生命周期的, starting, pre-start, spawned, post-start, running, pre-stop, stoping, killed, post-stop, 其中仅有starting, started, stopping, stopped四个状态会引发init进程发送相应的event.
event分为三类,signal(非阻塞异步的), methods(阻塞同步的),hooks(阻塞同步,调用发出hooks事件的进程必须等待事件完成才可以得到控制权,但不检查事件是否成功)。
job的配置文件位于/etc/init目录,如/etc/init/mysql.conf
D-Bus是一个系统消息服务.
每个用户的习惯不一样,所以需要对用户会话进行定制,称为Session Init。字符模式相对简单,各种shell都支持一个自动运行的脚本如~/.bashrc,用户可在这里定制。但对于图形界面模式,用户登录后看到的不是shell提示符,而是一个桌面, 以ubuntu为例,用户登录登录时,显示管理器(Display Manager) lightDM启动XSession, XSession接着启动gnome-session, gnome-session负责其他的初始化工作,然就就开始了一个desktop session. 这中间的很多服务也不一定非要在启动时就全启动的,这样基于Upstart的按需启动模式就可以派上用场了。
传统的init的任务管理是基于SysVInit的,它是基于运行级别的,转用UpStart后,为向前兼容必须模拟老的SysVnit的运行级别模式,以便和多数现有软件兼容。UpStart模拟的启动过程如下:
1, 系统加电,运行BIOS上的GRUB载入内核。
2, 内核执行initrd执行硬件初始化和内核自身的初始化
3, 内核启动pid=1的init进程,即UpStart进程
4, Upstart进程在执行了一些自身的初始化工作后,立即发出startup事件
5, 所以依赖于startup的事件都会被触发,基中最重要的就是mountall来挂载文件系统, mountall job又会发出local-filesystem, virtual-filesystem, all-swaps三个events.
6, 其中virtual-filesystem event触发udev任务开始工作。
7, udev触发upstart-udev-bridge工作,接着发生net-device-up IFACE=lo事件,表示本地回环设备已就绪。同时,任务 mountall 继续执行,最终会发出 filesystem 事件。此时,任务 rc-sysinit 会被触发,因为 rc-sysinit 的 start on 条件如下:
start on filesystem and net-device-up IFACE=lo
8, 任务 rc-sysinit 调用 telinit。Telinit 任务会发出 runlevel 事件,触发执行/etc/init/rc.conf。
9, rc.conf 执行/etc/rc$.d/目录下的所有脚本,和 SysVInit 非常类似
UpStart 的命令"initctl reload"被设计为可以让服务在不重启的情况下更新配置。当收到 SIGTERM 信号后,UpStart 希望精灵进程进程立即干净地退出,释放所有资源。如果一个进程在收到 SIGTERM 信号后不退出,Upstart 将对其发送 SIGKILL 信号。

Upstart的一些常用命令, initctl命令与传统的service命令一一对照,如initctl start就等于service start, 启动服务也可以使用start <job>来简化initctl命令:
1, initctl list
2, runlevel, 相较于sysvinit,它是修改/etc/init/rc-sysinti.conf 中的 DEFAULT_RUNLEVEL 这个参数,以便修改默认启动运行级别
3, initctl emit <event>, 发送事件,用于排错

对于只安装了upstart的环境,其配置文件在/etc/init/mysql.conf,所以这时通过start mysql或initctl start mysql可以启动mysql, 但想通过/etc/init.d/mysql start方式启动时就会报找不着sysv-init的配置文件/etc/init.d/mysql,所以为了兼容,一般要做一个软链(sudo ln -s /lib/init/upstart-job /etc/init.d/mysql), upstart-job会调用upstart的相关命令去操作。
上面这种方式确实避免了upstart与sysv-init两种方式的兼容性问题,在只用upstart一种时没问题。但关键是现在一个用户可以在机器上同时安装 systemd/systemd units, upstart/upstart jobs, and sysv-init/init.d三种方法。所以这时候当执行/etc/init.d/mysql应该取决于实际的方法(如systemd)。


对于ubuntu的虚机使用upstart时会报错:Start: Unable To Connect To Upstart: Failed To Connect To Socket /Com/Ubuntu/Upstart: Connection Refused

workaround如下:

sudo dpkg-divert --local --rename --add /sbin/initctl
ln -s /bin/true /sbin/initctl


 类似资料: