1. 前言

在进行centos上开发时,将一些软件设置为开机启动,又或者是能够使用systemctl命令进行启动会增加便利性,这里介绍centos上自定义开机启动的方法。
systemctl 用于系统服务的配置,部署,redhat系已经将systemd作为了其默认的系统服务管理工具。其他实现方法也有service命令,或者直接修改/etc/init.d文件,再或者使用chkconfig这样的工具。

2. 本文分析内容安排

  • 建立服务文件
  • 保存目录
  • 设置开机启动

3. 建立服务文件

开机启动配置文件在/lib/systemd/system目录中,服务以.service结尾,这里以docker仓库项目registry为例进行说明。registry启动需要加配置文件,配置文件为config-example.yml,我将之放到了/home/neo/docker-registry目录中,将registry移动到了/usr/bin目录下,那么启动registry镜像仓库的命名为registry /home/neo/docker-registry/config-example.yml。每次都这么启动太过麻烦,这里介绍开机自启动方式,首先建立服务文件/lib/systemd/system/registry.service。文件的具体内容为:

[Unit]
Description=Docker Registry
After=network.target

[Service]
Type=simple
ExecStart=/usr/bin/registry /home/neo/docker-registry/config-example.yml
Execstop=/bin/kill /usr/bin/registry

[Install]
WantedBy=multi-user.target

注意:[Service]中需要加上Execstop=/bin/kill /usr/bin/registry,不然当执行systemctl start registry命令时不会退出到后台

4. 保存文件

以644的权限保存文件

5. 设置开机启动

改变service文件时需要执行systemctl daemon-reload来使改变生效
启动registry服务命令:
systemctl start registry
开启启动registry命令:
systemctl enable registry

6. 作者介绍

梁明远,国防科大并行与分布式计算国家重点实验室(PDL)应届研究生,14年入学伊始便开始接触docker,准备在余下的读研时间在docker相关开源社区贡献自己的代码,毕业后准备继续从事该方面研究。邮箱:liangmingyuanneo@gmail.com

7. 参考文献

附录:单元文件结构

[Unit]

包含不依赖单元类型的一般选项,这些选项提供单元描述,知道单元行为,配置单元和其他单元的依赖性

Description :
单元描述信息,(systemctl status)命令时输出这些文字信息。一段描述这个 Unit 文件的文字,通常只是简短的一句话
Documentation :
单元文档信息的URLs。指定服务的文档,可以是一个或多个文档的URL路径
After :
定义 在哪些单元之后启动本单元,本单元只在指定的单元启动之后启动,会在后面列出的所有模块全部启动完成以后,才会启动当前的服务
Before :
定义 在哪些单元之前启动本单元,在启动指定的任一个模块之前,都会首先确保当前服务已经运行
Requires :
配置单元的依赖性,在Requires选项中的单元需要一起被激活,如果有一个单元启动失败,其他单元都不会被启动。
Wants :
比Requires选项依赖性要弱很多,触发启动列出的每个 Unit 模块,而不去考虑这些模块启动是否成功.如果列表之中的的单元启动失败,不会对其他单元造成影响
BindsTo :
更强的关联。启动这个服务时会同时启动列出的所有模块,当有模块启动失败时终止当前服务。反之,只要列出的模块全部启动以后,也会自动启动当前服务。并且这些模块中有任意一个出现意外结束或重启,这个服务会跟着终止或重启。
PartOf :
这是一个 BindTo 作用的子集,仅在列出的任何模块失败或重启时,终止或重启当前服务,而不会随列出模块的启动而启动
OnFailure :
当这个模块启动失败时,就自动启动列出的每个模块
Conflicts :
定义单元冲突关系,和Requires相反,与这个模块有冲突的模块,如果列出模块中有已经在运行的,这个服务就不能启动,反之亦然

[Service]

单元特定的类型指令,在此节组织,这个段是 .service 文件独有的,也是对于服务配置最重要的部分。

Type : 配置单元进程在启动时候的类型,影响执行和关联选项的功能,可选的关键字是:
simple : 默认值,进程和服务的主进程一起启动;(这个可以在执行完命令后回到命令行形式即后台)
forking : 进程作为服务主进程的一个子进程启动,父进程在完全启动之后退出。
oneshot : 同simple相似,但是进程在启动单元之后随之退出。
dbus : 同simple相似,但是随着单元启动后只有主进程得到D-BUS名字。
notify : 同simple相似,但是随着单元启动之后,一个主要信息被sd_notify()函数送出。
idle : 同simple相似,实际执行进程的二进制程序会被延缓直到所有的单元的任务完成,主要是避免服务状态和shell混合输出。
ExecStart :
指定启动单元的命令或者脚本,这个参数是几乎每个 .service 文件都会有的,指定服务启动的主要命令,在每个配置文件中只能使用一次。
ExecStartPre :
指定在ExecStart之前用户自定义执行的脚本。Type=oneshot允许指定多个希望顺序执行的用户自定义命令。
指定在启动执行 ExecStart 的命令前的准备工作,可以有多个,所有命令会按照文件中书写的顺序依次被执行。
ExecStartPost :
指定在ExecStart之后用户自定义执行的脚本
指定在启动执行 ExecStart 的命令后的收尾工作,也可以有多个
ExecStop :
指定单元停止时执行的命令或者脚本。
停止服务所需要执行的主要命令
ExecStopPost :
指定在 ExecStop 命令执行后的收尾工作,也可以有多个
TimeoutStopSec :
停止服务时的等待的秒数,如果超过这个时间服务仍然没有停止,systemd 会使用 SIGKILL 信号强行杀死服务的进程。
ExecReload :
指定单元重新加载时执行的命令或者脚本。
Restart :
这个选项如果被允许,服务重启的时候进程会退出,会通过systemctl命令执行清除并重启的操作。
这个值用于指定在什么情况下需要重启服务进程。常用的值有 no,on-success,on-failure,on-abnormal,on-abort 和 always。默认值为 no,即不会自动重启服务
RestartSec :
如果服务需要被重启,这个参数的值为服务被重启前的等待秒数
RemainAfterExit :
如果设置这个选择为真,服务会被认为是在激活状态,即使所以的进程已经退出,默认的值为假,
这个选项只有在Type=oneshot时需要被配置
值为 true 或 false(也可以写 yes 或 no),默认为 false。
当配置值为 true 时,systemd 只会负责启动服务进程,之后即便服务进程退出了,systemd 仍然会认为这个服务是在运行中的。
这个配置主要是提供给一些并非常驻内存,而是启动注册后立即退出然后等待消息按需启动的特殊类型服务使用
TimeoutStartSec :
启动服务时的等待的秒数,如果超过这个时间服务任然没有执行完所有的启动命令,则 systemd 会认为服务自动失败。
通常对于这种服务,需要将 TimeoutStartSec 的值指定为 0,从而关闭超时检测
Environment :
为服务添加环境变量
EnvironmentFile :
指定加载一个包含服务所需的环境变量列表的文件,文件中的每一行都是一个环境变量的定义
Nice :
服务的进程优先级,值越小优先级越高,默认为0。-20为最高优先级,19为最低优先级
WorkingDirectory:
指定服务的工作目录
RootDirectory :
指定服务进程的根目录( / 目录),如果配置了这个参数后,服务将无法访问指定目录以外的任何文件。
User :
指定运行服务的用户,会影响服务对本地文件系统的访问权限
Group :
指定运行服务的用户组,会影响服务对本地文件系统的访问权限

[Install]

包含systemctl enable或者disable的命令安装信息

Alias :
为单元提供一个空间分离的附加名字。
RequiredBy :
和前面的 Requires 作用相似,同样后面列出的不是服务所依赖的模块,而是依赖当前服务的模块。
WantedBy :
和前面的 Wants 作用相似,只是后面列出的不是服务所依赖的模块,而是依赖当前服务的模块
Also :
指出和单元一起安装或者被协助的单元。
DefaultInstance :
实例单元的限制,这个选项指定如果单元被允许运行默认的实例