我们的项目需要一个启动一个外部的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. MyBatis学习笔记(六)——调用存储过程

    转自孤傲苍狼的博客:http://www.cnblogs.com/xdp-gacl/p/4270352.html 一.提出需求 查询得到男性或女性的数量, 如果传入的是0就女性否则是男性 二.准备数据 ...

  2. 把HDFS上的数据导入到Hive中

    1. 首先下载测试数据,数据也可以创建 http://files.grouplens.org/datasets/movielens/ml-latest-small.zip 2. 数据类型与字段名称 m ...

  3. 删除对象的属性 delete的用法

    Javascript的变量 实际上JavaScript中,变量 = 对象属性,这是因为 Javascript 在执行脚本之前会创建一个Global对象,所有的全局变量都是这个Global对象的属性,执 ...

  4. Low-level Native Plugin Interface

    http://docs.manew.com/Manual/index.htm https://docs.unity3d.com/Manual/NativePluginInterface.html ht ...

  5. MySQL Crash Course #03# Chapter 5. 6 排序. BETWEEN. IS NULL

    索引 排序检索的数据 SQL 过滤 vs. 应用程序过滤 简单 Where 补充:大小写敏感. BETWEEN. IS NULL Sorting Retrieved Data mysql> SE ...

  6. Centos 更改系统时间

    .date //查看本地 .hwclock --show //查看硬件的时间 .如果硬件的时间是对不上,那就对硬件的时间进行修改 .hwclock --set --date '2222-22-22 2 ...

  7. bzoj1639 / P2884 [USACO07MAR]每月的费用Monthly Expense

    P2884 [USACO07MAR]每月的费用Monthly Expense 二分经典题 二分每个段的限制花费,顺便统计下最大段 注意可以分空段 #include<iostream> #i ...

  8. JavaScript 添加新元素

    JavaScript 添加新元素 版权声明:未经授权,严禁转载! 添加元素 创建元素 使用 JS 可以为一个已有的元素添加一个新的子元素. 第一步:创建空元素. - var elem = docume ...

  9. 06: AJAX全套 & jsonp跨域AJAX

    目录: 1.1 AJAX介绍 1.2 jQuery AJAX(第一种) 1.3 原生ajax(第二种) 1.4 iframe“伪”AJAX(第三种) 1.5 jsonp跨域请求 1.6 在tornad ...

  10. 20145314郑凯杰《网络对抗技术》恶意DLL注入进程(进程捆绑)的实现

    20145314郑凯杰<网络对抗技术>恶意DLL注入进程(进程捆绑)的实现 一.本节摘要 简介:在这部分里,要实现将恶意后门悄无声息地与进程进行捆绑,通过和已运行的进程进行捆绑,达到附着攻 ...