linux upstart机制简介及封装应用

    xiaoxiao2022-06-27  204

    前言

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

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

     

    文章目录

    初识upstartupstart任务文件的语法upstart命令upstart封装mytest例子:upstart封装Nginx例子:upstart封装MySQL例子: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: 脚本块,包括主运行脚本

    语法:

       

    script

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

    end script

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

    语法:

       

    pre-start script

    exec rm /root/upstart.txt

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

    end script

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

    语法:

       

    post-start script

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

    end script

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

    语法:

       

    pre-stop script

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

    end script

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

    语法:

       

    post-stop script

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

    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: 定义实例名字,可以通过命令给任务传参数 语法:

       

    instance $TTY

    exec /sbin/getty -8 38300 $TTY

     

    #通过命令传参数

    ~ 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版本

     

    ~ initctl version

    init (upstart 1.5)

    查看mytest应用状态

     

    #方法1

    ~ initctl list|grep mytest

    #方法2

    ~ status mytest

    启动mytest应用

     

    #方法1:

    ~ initctl start mytest

    #方法2

    ~ start mytest

    停止mytest应用

     

    #方法1:

    ~ initctl stop mytest

    #方法2

    ~ stop mytest

    4. upstart封装mytest

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

     

    ~ vi /etc/init/mytest.conf

     

    description "mytest"

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

     

    env var=bar

    export var

     

    start on startup

    stop on shutdown

     

    respawn

    respawn limit 2 5

     

    console output

     

    pre-start script

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

    var=pre-start

    export var

    logger "pre-


    最新回复(0)