linux upstart机制简介及封装应用

(147) 2024-04-28 11:01:01

前言

对于使用linux的同学,敲大段的命令都已经是家长便饭了。但有些时候用命令也不是那么方便,比如启动一个后台程序, sh ./app & 执行启动命令很简单,如果想停止这个应用或者重启这个应用,就不是那么方便了。

如果能把应用封装成系统服务,那么就可以使用的 启动,重起,停止,状态检查等的标准方法了。应用会像一个守护程序一样,被操作系统所管理。

 

文章目录

  1. 初识upstart
  2. upstart任务文件的语法
  3. upstart命令
  4. upstart封装mytest
  5. 例子:upstart封装Nginx
  6. 例子:upstart封装MySQL
  7. 例子:upstart封装ssh

1. 初识upstart

说来惭愧,用了很多年的linux,也没有想法去怎么能优化一下应用启动。最近部署Nodejs应用时才发现,原来ubuntu有这么优雅的应用管理方式。

upstart可以用来代替/etc/init.d/的执行脚本,额外提供了一些特性,像速度,状态检查,简单定义任务等。

upstart两个核心点:事件(events),任务(jobs)

事件状态图

对状态的描述

  • waiting : initial state.
  • starting : job is about to start.
  • pre-start : running pre-start section.
  • spawned : about to run script or exec section.
  • post-start : running post-start section.
  • running : interim state set after post-start section processed denoting job is running (But it may have no associated PID!)
  • pre-stop : running pre-stop section.
  • stopping : interim state set after pre-stop section processed.
  • killed : job is about to be stopped.
  • post-stop : running post-stop section.

每个任务需要有一个配置文件,存放在/etc/init/目录下面。

~ vi /etc/init/mytest.conf

完成任务配置文件后,可以直接用initctl, start, stop 命令对任务进行启动,停止,查看状态 等的操作。

start mytest.conf

注:下面所有实例都以root权限进行操作

本文主要以实践为主。原理及更多细节介绍,请查看Upstart Cookbook:

http://upstart.ubuntu.com/cookbook/

2. upstart任务文件的语法

详细介绍: http://upstart.ubuntu.com/wiki/Stanzas
注:Stanzas的文档很多内容已经过期,建议参考cookbook或者man的使用帮助。

任务文件支持的语法关键字

Process Definition:
exec, script, pre-start, post-start, pre-stop, post-stop,

Event Definition:
start on, stop on, manual

Job Environment:
env, export

Services, tasks and respawning:
normal exit, respawn, respawn limit, task

Instances:
instance

Documentation:
description, author, version, emits, usage

Process environment:
console none,console log, console output, console owner, nice, limit, chroot, chdir, oom score, setgid, setuid, umask

Process Control:
expect fork, expect daemon, expect stop, kill signal, kill timeout

过期关键字:
service, daemon, pid

部分语法关键字介绍:

exec : 执行命令,在script块中使用。

语法:exec /usr/bin/zip -v

script: 脚本块,包括主运行脚本

语法:

 
  1.  
  2. script

  3. exec /usr/bin/zip /root/upstart.zip /root/upstart.txt

  4. end script

pre-start: 脚本块,在主运行脚本之前执行的脚本

语法:

 
  1.  
  2. pre-start script

  3. exec rm /root/upstart.txt

  4. exec echo pre-start >> /root/upstart.txt

  5. end script

post-start: 脚本块,在主运行脚本之后,running状态之前

语法:

 
  1.  
  2. post-start script

  3. exec echo post-start >> /root/upstart.txt

  4. end script

pre-stop: 脚本块,在执行stop之前

语法:

 
  1.  
  2. pre-stop script

  3. exec echo pre-stop >> /root/upstart.txt

  4. end script

post-stop: 脚本块,在主运行脚本被杀死之后

语法:

 
  1.  
  2. post-stop script

  3. exec echo post-stop >> /root/upstart.txt

  4. end script

start on: 事件,启动任务

语法:

start on startup

stop on: 事件,停止任务

语法:

stop on suhtdown

description: 描述,信息提示
语法:

description "This is a upstart testing."

author: 描述,作者信息
语法:

author "Conan_Z <bsspirit@gmail.com>"

version: 描述,版本信息
语法:

version "0.0.1 dev"

respawn: 命令,设置服务异常停止后自动重启
语法:

respawn

respawn limit: 命令,设置服务异常停止后重启次数及间隔时间
语法:

respawn limit 15 3

service: 命令,0.6版本后不再使用,被respawn取代

instance: 定义实例名字,可以通过命令给任务传参数
语法:

 
  1.  
  2. instance $TTY

  3. exec /sbin/getty -8 38300 $TTY

  4.  
  5. #通过命令传参数

  6. ~ start mytest $TTY=tty1

daemon: 作为守护进程的标志,0.5.0版本后被expect fork取代

kill timeout: 命令,在到达指定时间后,停止应用

语法:

kill timeout 5

kill timeout: 命令,正常退出,不会被respawn重启

语法:

normal exit 0 TERM

console: 命令,控制后输出,支持4种操作logged|output|owner|none

语法:

console owner

env: 变量,设置任务的环境变量

语法:

env PIDFILE=/var/run/myprocess.pid

umask: 变量,设置任务的文件权限的掩码

语法:

umask 0755

nice: 变量,设置任务的调度优先级

语法:

nice -5

limit: 变量,设置任务的资源限制

语法:

limit nproc 10 10

chroot: 变量,设置任务的根目录

语法:

chroot /var/lib/www/jail

chdir: 变量,设置任务的工作目录

语法:

chdir /var/tmp

3. upstart命令介绍

查看upstart版本

 
  1. ~ initctl version

  2. init (upstart 1.5)

查看mytest应用状态

 
  1. #方法1

  2. ~ initctl list|grep mytest

  3. #方法2

  4. ~ status mytest

启动mytest应用

 
  1. #方法1:

  2. ~ initctl start mytest

  3. #方法2

  4. ~ start mytest

停止mytest应用

 
  1. #方法1:

  2. ~ initctl stop mytest

  3. #方法2

  4. ~ stop mytest

4. upstart封装mytest

用upstart写一个简单的应用脚本。

 
  1. ~ vi /etc/init/mytest.conf

  2.  
  3. description "mytest"

  4. author "bsspirit <http://blog.fens.me>"

  5.  
  6. env var=bar

  7. export var

  8.  
  9. start on startup

  10. stop on shutdown

  11.  
  12. respawn

  13. respawn limit 2 5

  14.  
  15. console output

  16.  
  17. pre-start script

  18. logger "pre-start: before: var=$var"

  19. var=pre-start

  20. export var

  21. logger "pre-

THE END

发表回复