我们的项目需要一个启动一个外部的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 

这端代码会启动一个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/

initctl 创建自己的JOB的更多相关文章

  1. LVM卷的创建及案例演示

    LVM:Logical Volume Manager, Version:2dm: device mapper,将一个或多个底层块设备组织成一个逻辑设备的模块. /dev/dm-# 这里的#表示数字,代 ...

  2. 创建基于 AFS 的 Docker 容器卷

    标准的 Docker 容器卷一般是位于 Docker 主机上的一个本地目录.在这样的配置下,容器必须依赖于一台特定的主机,因此使得容器的迁移和扩展变得困难.通过使用容器卷插件,能让容器访问独立于主机的 ...

  3. Docker之使用Dockerfile创建定制化镜像(四)

    Dockerfile简介 镜像的定制实际上就是定制每一层所添加的配置.文件.如果我们可以把每一层修改.安装.构建.操作的命令都写入一个脚本,用这个脚本来构建.定制镜像,那么哪些无法重复的问题.镜像构建 ...

  4. In-Memory:在内存中创建临时表和表变量

    在Disk-Base数据库中,由于临时表和表变量的数据存储在tempdb中,如果系统频繁地创建和更新临时表和表变量,大量的IO操作集中在tempdb中,tempdb很可能成为系统性能的瓶颈.在SQL ...

  5. 创建 OVS flat network - 每天5分钟玩转 OpenStack(134)

    上一节完成了 flat 的配置工作,今天创建 OVS flat network.Admin -> Networks,点击 "Create Network" 按钮. 显示创建页 ...

  6. ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第二章:利用模型类创建视图、控制器和数据库

    在这一章中,我们将直接进入项目,并且为产品和分类添加一些基本的模型类.我们将在Entity Framework的代码优先模式下,利用这些模型类创建一个数据库.我们还将学习如何在代码中创建数据库上下文类 ...

  7. ABP入门系列(2)——通过模板创建MAP版本项目

    一.从官网创建模板项目 进入官网下载模板项目 依次按下图选择: 输入验证码开始下载 下载提示: 二.启动项目 使用VS2015打开项目,还原Nuget包: 设置以Web结尾的项目,设置为启动项目: 打 ...

  8. 记一次tomcat线程创建异常调优:unable to create new native thread

    测试在进行一次性能测试的时候发现并发300个请求时出现了下面的异常: HTTP Status 500 - Handler processing failed; nested exception is ...

  9. 在WPF中使用依赖注入的方式创建视图

    在WPF中使用依赖注入的方式创建视图 0x00 问题的产生 互联网时代桌面开发真是越来越少了,很多应用都转到了浏览器端和移动智能终端,相应的软件开发上的新技术应用到桌面开发的文章也很少.我之前主要做W ...

随机推荐

  1. VS2010/MFC编程入门之五十一(图形图像:GDI对象之画刷CBrush)

    上一节中鸡啄米主要讲的是画笔CPen的用法,前面也说了,GDI对象中最常用的就是画笔和画刷,本节就讲讲画刷CBrush. 鸡啄米依然是通过实例的方式来说明画刷的用法.此实例要实现的功能是,对话框上有一 ...

  2. js 数组操作

    toString():把数组转换成一个字符串 toLocaleString():把数组转换成一个字符串 join():把数组转换成一个用符号连接的字符串 shift():将数组头部的一个元素移出 un ...

  3. Linux中Postfix邮件安装Maildrop(八)

    Postfix使用maildrop投递邮件 Maildrop是本地邮件投递代理(MDA), 支持过滤(/etc/maildroprc).投递和磁盘限额(Quota)功能. Maildrop是一个使用C ...

  4. 案例:java进制互转

    十 进制转成十六进制: Integer.toHexString(int i) 十进制转成八进制 Integer.toOctalString(int i) 十进制转成二进制 Integer.toBina ...

  5. PowerDesigner 教程

    摘自:http://www.cnblogs.com/advocate/p/3730027.html 目标:本文主要介绍PowerDesigner中概念数据模型 CDM的基本概念. 一.概念数据模型概述 ...

  6. python的os模块和sys模块

    os模块 os.getcwd()  获取当前的工作目录 os.chdir('绝对路径/相对于当前工作目录的路径')  改变工作目录,相当于shell的cd命令,例如Windows平台下os.chdir ...

  7. 20165211 2017-2018-2 《Java程序设计》第1周学习总结

    20165211 丁奕 2017-2018-2 <Java程序设计>第1周学习总结 教材学习内容总结 在本周的学习过程中,我在虚拟机中完成了安装JDK,IDEA,Git,以及Java2实践 ...

  8. codevs1001 舒适的路线 - 贪心 - 并查集

    题目描述 Description Z小镇是一个景色宜人的地方,吸引来自各地的观光客来此旅游观光.Z小镇附近共有N(1<N≤500)个景点(编号为1,2,3,…,N),这些景点被M(0<M≤ ...

  9. CF 316E3 Summer Homework(斐波那契矩阵+线段树)

    题目链接:http://codeforces.com/problemset/problem/316/E3 题意:一个数列A三种操作:(1)1 x y将x位置的数字修改为y:(2)2 x y求[x,y] ...

  10. JS ——DOM,BOM(包含盒模型,动画)总结

    JS盒模型 content: 通过计算后样式获取padding + content: box.clientWidth | box.clientHeightborder + padding + cont ...