在linux下创建自定义服务

利用systemctl创建服务

历史版本中的linux对服务的操作是通过service来完成的。若创建用户自定义的服务,则需要较为复杂的操作。目前linux新的发行版已经内置了systemctl来操作服务。

服务脚本编写

新的自定义服务脚本以service为后缀,这些service文件存放于/lib/systemd/system中。我们只需要编写符合标准规范的service脚本文件,放在这个文件夹下面即可。这个标准的服务文件格式如下:

2.png

三个部分

这个脚本分为3个部分:[Unit] [Service] [Install]。

Unit

Unit表明该服务的描述,类型描述。我们称之为一个单元。比较典型的情况是单元A要求在单元B启动之后再启动。这种设置是通过Unit下面的Requires、After、Before、Wants来调整的。比如上述场景的编写可以这样(在A中编写):

Requires=B
After=B

这段设置表明了A的启动依赖于B,同时有要求在B启动之后启动自己。设置十分简介。需要注意的是,依赖关系通常用在服务(Service)而不是目标(Target)上。

Service

Service是脚本的关键部分,这一部分用于设置一些关键参数:

  • Type=forking : 后台运行模式
  • PIDFile=/xxx/xxx.xxx : 存放PID文件的位置
  • ExecStart=/bin/echo xxx : 这是服务运行的具体执行命令
  • ExecReload=/bin/echo xxx : 这是服务重启的执行命令
  • EexcStop=/bin/echo xxx : 这是服务停止的执行命令

Service的启动方式,在Service段中,启动方式使用Type指定。具体可以参考man systemd.service

值得注意的是,在脚本中关于服务启动、重启、关闭的指令需要使用绝对路径,否则会出现无法识别的情况。

当完成一个服务脚本后,我们就可以使用systemctl start|stop|restart xxx.service等指令了。若要开机启动这个服务我们使用如下的指令:

  • systemctl enable xxx.service

若要关闭开机启动:

  • systemctl disable xxx.service

当我们需要查看服务信息的使用可以使用如下指令:

  • systemctl list-units --type=service : 列出正在运行的服务

在service片段中有几个概念很重要,这直接影响到实践中创建自定义服务的最终结果。以下内容根据linux系统
man systemd.service用户手册说明经过翻译和整理而得。

service配置之Type

首先是Type配置,在service片段中有Type的配置,这个配置给当前的服务单元用于设置进程的启动类型。
Type有如下几种可选项:

  • simple
  • forking
  • oneshot
  • dbus
  • notify
  • idel

simple,这是默认的Type,当Type和BusName配置都没有设置,指定了ExecStart设置后,simple就是默认的Type设置。simple使用ExecStart创建的进程作为服务的主进程。在此设置下systemd会立即启动服务,如果该服务要启动其他服务(simple不会forking),它们的通讯渠道应当在守护进程启动之前被安装好(e.g. sockets,通过sockets激活)。

forking,如果使用了这个Type,则ExecStart的脚本启动后会调用fork()函数创建一个进程作为其启动的一部分。当一切初始化完毕后,父进程会退出。子进程会继续作为主进程执行。这是传统UNIX主进程的行为。如果这个设置被指定,建议同时设置PIDFile选项来指定pid文件的路径,以便systemd能够识别主进程。

oneshot,onesh的行为十分类似simple,但是,在systemd启动之前,进程就会退出。这是一次性的行为。可能还需要设置RemainAfterExit=yes,以便systemd认为j进程退出后仍然处于激活状态。

dbus,这个设置也和simple很相似,该配置期待或设置一个name值,通过设置BusName=设置name即可。

notify,同样地,与simple相似的配置。顾名思义,该设置会在守护进程启动的时候发送推送消息(通过sd_notify(3))给systemd。

Service其他配置节点

  • RemainAfterExit:默认值no

默认值为no,这个设置采用booleean值,可以是0、no、off、1、yes、on等值。它表明服务是否应当被视为激活的,即便当它所有的进程都退出了。简言之,这个设置用于告诉systemd服务是否应当是被视为激活状态,而不管进程是否退出。当为true时,即便服务退出,systemd依然将这个服务视为激活状态,反之则服务停止。

  • GuessMainPID

采用boolean值指定systemd在无法确切的查明服务的时候是否需要猜测服务的main pid。除非Type=forking被采用并且PIDFile没有被设置,否则这个选项会被忽略。因为当设置为Type的其他选项,或者显示的指定了PID文件后,systemd总是能够知道main pid。

  • PIDFile

采用一个绝对路径的文件名指定守护进程的PID文件。当Type=forking被设置的时候,建议采取这个设置。当服务启动后,systemd会读取守护进程的主进程id。systemd不会对该文件写入数据。

  • BusName

使用一个D-Bus的总线名称,作为该服务的可访问名称。当Type=dbus的时候,该设置被强制使用。

  • BusPolicy

如果该选项被指定,一个自定义的kdbus终结点将会被创建,并且会被指定为默认的dbus节点安装到服务上。这样的自定义终结点自身持有一个策略规则集合。这些规则将会在总线范围内被强制指定。该选项只有在kdbus被激活时有效。

  • ExecStart

当服务启动的时候(systemctl start youservice.service),会执行这个选项的值,这个值一般是“ExecStart=指令 参数”的形式。当Type=oneshot的时候,只有一个指令可以并且必须给出。原因是oneshot只会被执行一次。

  • ExecStartPreExecStartPost

顾名思义,这两个设置的意义在于ExecStart被执行之前和之后被执行。

  • ExecReload

服务重启时执行。

  • ExecStop

服务停止时执行。

  • ExecStopPost

服务停止后执行。

未完待续...

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,905评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,140评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,791评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,483评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,476评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,516评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,905评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,560评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,778评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,557评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,635评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,338评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,925评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,898评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,142评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,818评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,347评论 2 342

推荐阅读更多精彩内容

  • muahao阅读 2,062评论 0 3
  • systemd攻略 转自http://www.jianshu.com/p/d5305104d03a或者这个http...
    x1596357阅读 2,835评论 0 3
  • 启动流程:POST --> Boot Sequence --> Bootloader --> kernel +in...
    尛尛大尹阅读 1,008评论 0 1
  • systemd攻略 相关文档 arch 的 systemd 说明页面 (简体中文) fedora 的 system...
    muahao阅读 11,589评论 0 12
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,580评论 18 139