Nodejs 使用 Upstart 快捷管理系统服务

Nodejs 使用 Upstart 快捷管理系统服务

Upstart 是一个由 Canonical 公司(就是开发 Ubuntu 的公司)开发和维护的一个的基于事件的开源 Linux 服务管理程序,它目标是替换掉基于 System-V 规范的 /sbin/init 程序。

为什么要用 Upstart ?

先说说传统的 System-V init(以下简称 SysVinit)的问题,SysVinit 只是简单地在系统启动、结束和切换预定义的几个 Runlevel 时根据文件名的顺序执行调用实现了 System-V 定义的服务控制脚本,就是大部分人熟悉的以下几个路径和里面的脚本内容格式:

/etc/inittab # 系统初始化过程的定义文件
/etc/init.d  # 存放实际的服务控制脚本
/etc/rc?.d   # 存放不同 Runlevel 对应 init.d 里的脚本的软连接
/etc/rc.*    # 特定情况下执行的脚本

SysVinit 并不实际管理脚本具体做的事情,只要脚本能接受 start / restart / stop / status 等几个参数就视为符合定义(实际上即使不接受以上参数也可以放入 init.d 里让 SysVinit 调用,但会产生非预期的效果),对于服务是否正常启动,启动后是否异常退出,SysVinit 并不管理,这往往需要开发者在编写服务管理脚本时自行实现相关逻辑甚至编写额外的守护进程保证服务程序的可用性(MySQL 自带的 mysqld_safe 就是一个例子);

同时亦由于这个原因,SysVinit 无法处理服务之间的依赖关系,例如 Tomcat 依赖 MySQL,那么 Tomcat 启动之前需要先启动 MySQL,如果 MySQL 无法启动,Tomcat 也不应该启动,但由于 SysVinit 是顺序执行的,即使配置了先启动 MySQL 再启动 Tomcat,即使 MySQL 启动失败,Tomcat 依然会被启动,从而导致服务异常;

另外,由于顺序执行和无法感知服务之间的依赖关系,使得通过 SysVinit 实现服务并行启动加快系统启动速度的方案变得困难。Upstart 就是为了解决以上各种问题而被开发出来的。

怎样使用 Upstart 在 Ubuntu 6.0 以上版本就已经开始集成 Upstart,由于各个发行版及其各个版本安装 Upstart 的方式和集成度有一定差异,需要额外展开,所以这里先以 Ubuntu 系统基础操作环境。

Upstart 的所有服务管理脚本存放在

/etc/init/*.conf # 文件名就是 service name

脚本内容也不像 SysVinit 那样是一个普通的 shell 脚本,而是它预先规范好的一个配置文件(以下也称之为“配置文件”而非“脚本”),一个最基础的配置文件是这样的

description     "MySQL Service"

start on runlevel [2345] stop on runlevel [!2345]

exec /usr/bin/mysqld

整个配置文件非常简洁,第一行是服务描述,可有可无,但一般会写上以便理解,Upstart 保留了 Runlevel 的概念,这里定义了该服务在 runlevel 为 2 3 4 5 时启动该服务,而非这几个 Runlevel 时停止改服务,启动服务的命令为 /usr/bin/mysqld。把该配置文件保存到

/etc/init/mysqld.conf

之后,我们就可以通过以下命令控制 MySQL Service 的启动状态

start mysqld   # 启动
restart mysqld # 重启
stop mysqld    # 停止
status mysqld  # 检查状态

在服务启动之后,Upstart 会自动把该服务的标准输出(stdout)内容保存在 /var/log/upstart/(service-name).log 文件里,这个例子就是存放在 /var/log/upstart/mysqld.log 文件里,供有需要时查阅。

可能有部分熟悉 MySQL 的同学注意到,这里用的是 mysqld 而不是 mysqld_safe,这是因为 Upstart 本身会用一个独立的进程运行服务,不会让服务阻塞 shell,而且独立进程还会监控服务的存活状态,当发现服务退出后做其它相关处理。

What’s Next?

由于 Upstart 的功能丰富,这里不打算一次全部介绍完毕,将会分几篇介绍,下一篇会介绍服务的依赖管理,状态和事件的处理方式。


Coding 架构师 欧俊飞

【Coding 官方技术博客是 Coding 内部小伙伴在平时的工作学习过程中关于技术、产品、设计等等方面的积累和分享,希望大家共同学习共同进步!如转载,请注明出处与作者,谢谢!】


2 回复

Nodejs 使用 Upstart 快捷管理系统服务

为什么使用 Upstart?

先说说传统的 System-V init(以下简称 SysVinit)的问题。SysVinit 只是简单地在系统启动、结束和切换预定义的几个 Runlevel 时根据文件名的顺序执行调用实现了 System-V 定义的服务控制脚本。这种方式存在一些局限性:

  1. 缺乏管理机制:SysVinit 不实际管理脚本具体做的事情,只是简单地调用脚本的 start/restart/stop/status 等命令。
  2. 无法处理服务依赖关系:例如,如果 Tomcat 依赖于 MySQL,SysVinit 不能确保在启动 Tomcat 之前 MySQL 已经成功启动。
  3. 启动顺序固定:SysVinit 按照固定的顺序启动服务,无法并行启动服务来加快系统启动速度。

为了解决这些问题,Canonical 开发了 Upstart,这是一个基于事件的 Linux 服务管理器,旨在替代 SysVinit。

如何使用 Upstart

在 Ubuntu 6.0 及以上版本中已经集成了 Upstart。所有的服务管理脚本都存放在 /etc/init/*.conf 目录下,文件名即为服务名称。

示例配置文件

假设我们要创建一个简单的 Node.js 应用服务,配置文件如下:

description "My Node.js Application"

start on runlevel [2345]
stop on runlevel [!2345]

# 设置工作目录
chdir /path/to/my/node/app

# 执行启动命令
exec node /path/to/my/node/app/index.js >> /var/log/upstart/node-app.log 2>&1

将上述配置文件保存为 /etc/init/node-app.conf

控制服务

之后,我们可以通过以下命令控制 Node.js 应用服务的启动状态:

start node-app   # 启动
restart node-app # 重启
stop node-app    # 停止
status node-app  # 检查状态
日志记录

Upstart 会自动将服务的标准输出(stdout)内容保存在 /var/log/upstart/(service-name).log 文件中。在这个例子中,日志文件会保存在 /var/log/upstart/node-app.log 中,方便查阅。

总结

Upstart 提供了一种更灵活和强大的方法来管理和监控系统服务。通过使用配置文件,我们可以轻松地定义服务的启动条件、依赖关系以及日志记录等。这对于管理复杂的 Node.js 应用程序特别有用。

下一步

接下来,我们将进一步探讨 Upstart 的其他功能,例如服务依赖管理、状态和事件的处理方式。


希望这篇介绍对你有所帮助!如果你有任何问题或建议,请随时留言交流。


Coding 架构师 欧俊飞

【Coding 官方技术博客是 Coding 内部小伙伴在平时的工作学习过程中关于技术、产品、设计等等方面的积累和分享,希望大家共同学习共同进步!如转载,请注明出处与作者,谢谢!】


Node.js 使用 Upstart 快捷管理系统服务

Upstart 是一个由 Canonical 公司(即开发 Ubuntu 的公司)开发的基于事件的 Linux 服务管理程序。它旨在取代基于 System-V 规范的 /sbin/init 程序,提供更灵活和高效的系统服务管理。

为什么要用 Upstart?

传统的 SysVinit 在启动、结束和切换 Runlevel 时,只是顺序执行服务控制脚本,不关心服务的健康状态和依赖关系。而 Upstart 则能够更好地管理这些方面:

  • 服务状态管理:Upstart 会监控服务的运行状态,并在服务退出时重新启动。
  • 依赖关系管理:可以定义服务之间的依赖关系,确保服务按正确的顺序启动。
  • 日志记录:Upstart 会自动将服务的标准输出保存到日志文件中,方便排查问题。

如何使用 Upstart

假设你需要管理一个 Node.js 应用。以下是创建一个 Upstart 服务管理脚本的步骤:

  1. 创建一个 .conf 文件:

    sudo nano /etc/init/my-node-app.conf
    
  2. 编辑 .conf 文件,添加以下内容:

    description "My Node.js Application"
    
    start on runlevel [2345]
    stop on runlevel [!2345]
    
    respawn
    
    exec node /path/to/your/app.js >> /var/log/upstart/my-node-app.log 2>&1
    
    • description:描述信息,可选。
    • start on runlevel [2345]:指定在哪些运行级别下启动服务。
    • stop on runlevel [!2345]:指定在哪些运行级别下停止服务。
    • respawn:指定服务退出后自动重启。
    • exec:指定启动命令,同时将标准输出重定向到日志文件。
  3. 保存并关闭文件。

  4. 测试配置文件:

    sudo init-checkconf /etc/init/my-node-app.conf
    
  5. 控制服务:

    sudo start my-node-app
    sudo stop my-node-app
    sudo restart my-node-app
    sudo status my-node-app
    

通过上述步骤,你可以使用 Upstart 来管理和控制你的 Node.js 应用。这种方式不仅简化了服务管理,还提供了更好的监控和日志记录功能。

回到顶部