zoukankan      html  css  js  c++  java
  • initctl 创建自己的JOB

    我们的项目需要一个启动一个外部的Jetty server。发现每次kill了这个jetty的进程后,系统会自动启动一个jetty。追查下去发现,原来是在/etc/init.d/jetty 脚本的start 函数里 使用了

    initctl start jetty

    而我们预想的start函数实现是这样的:

    java -jar start.jar

    开来古怪就在initctl了。为了说清楚initctl,我们需要先回顾一下历史。

    在SystemV这个版本的unix中,系统启动首先是启动init进程。这个进程会按照runlevle启动/etc/rc[0-6].d 目录下的脚本。这里rc后面的数字就是runlevel。举个例子,在图形界面打开以前,runlevel=5;如果系统启动了图形界面,那么runlevel就进入到6.那么/etc/rc6.d里面的脚本就会被一个一个的执行。这些脚本其实都是到/etc/init.d/下的脚本的软链接。

    注意上面讲到启动顺序是一个一个的执行,这不可避免的带来串行的时间开销。于是有了System V init 的改进版 “upstart”. initctl 就是upstart提供的一个命令。upstart 的一个优化就是使用的事件驱动,这样启动服务A的时候,不用等待A的结束就可以启动服务B了。在upstart的概念里,我们把服务称作JOB。使用命令

    initctl start JOB

    启动的JOB以init进程为父进程。当JOB的进程被杀死后,init进程会自动重新启动JOB。这就是 initctl start JOB 和 service JOB start 的主要区别吧。

    那么如何创建一个自己的JOB呢?

    需要在/etc/init/目录下创建一个.conf 文件。比如说我们的JOB叫 mywork。那么需要创建文件/etc/init/mywork.conf

    下面给一个mywork.conf的例子:

    exec python -m SimpleHTTPServer 8111

    这端代码会启动一个http server监听 8111 端口。

    建立了文件后,可以运行命令 initctl start mywork, 这样8111端口就被监听了。可以试试 curl localhost:8111,你会收到一段SimpleHTTPServer提供的默认HTML。你也可以尝试这杀掉监听8111端口的进程,不过很快脚本mywork.conf就会重新启动监听8111端口。

    怎么写mywork.conf 呢? 可以参考一下:http://www.mike.org.cn/articles/understand-upstart/

  • 相关阅读:
    brewhome
    WIN7下安装SQL server 2008 R2“出现性能计数器注册表配置单元一致性”失败的解决办法(新)
    话说ELK使用安装,结合.NET Core、ABP框架Nlog日志
    支付系统架构
    高可用Redis服务架构分析与搭建
    基于STS和JWT的微服务身份认证
    全面解读NoSQL数据库Redis的核心技术与应用实践
    Redis应用及安装
    微服务实践分享与探讨
    Docker的核心概念,镜像操作
  • 原文地址:https://www.cnblogs.com/englefly/p/3979087.html
Copyright © 2011-2022 走看看