一 背景
作为技术,我们一般都会买一些云服务跑一些程序或应用,而服务都希望开机自动启动,挂掉后自动启动,而不需要人为介入。
CentOS7支持我们通过systemctl自定义服务
二 先来一个示例
1 | cat << EOF > /usr/lib/systemd/system/stackedit.service |
三 自定义服务相关参数解析
配置文件主要分为3大块:
【Unit】
主要包括服务说明,与其他服务的联动关系
字段 | 说明 | 示例 |
---|---|---|
Description | 一段描述这个 Unit 文件的文字,通常只是简短的一句话。 | Description=Stackedit daemon |
Documentation | 指定服务的文档,可以是一个或多个文档的URL路径。 | |
Requires | 依赖的其他 Unit 列表,列在其中的 Unit 模块会在这个服务启动的同时被启动,并且如果其中有任意一个服务启动失败,这个服务也会被终止 | Requires=xx服务.service |
After | 与 Requires 相似,但会在后面列出的所有模块全部启动完成以后,才会启动当前的服务。 | After=network.target |
Before | 与 After 相反,在启动指定的任一个模块之前,都会首先确保当前服务已经运行。 | Before=xx服务.target |
Wants | 与 Requires 相似,但只是在被配置的这个 Unit 启动时,触发启动列出的每个 Unit 模块,而不去考虑这些模块启动是否成功。 | Wants=xx服务.service |
Conflicts | 与这个模块有冲突的模块,如果列出模块中有已经在运行的,这个服务就不能启动,反之亦然。 | Conflicts=iptables.service ip6tables.service |
OnFailure | 当这个模块启动失败时,就自动启动列出的每个模块。 | OnFailure=emergency.target |
注:After和Before字段只涉及启动顺序,不涉及依赖关系
【Service】
是服务的一些具体运行参数的设置
参数 | 说明 | 示例 |
---|---|---|
Type | 服务的类型,常用的有 simple(默认类型) 和 forking。默认的 simple 类型可以适应于绝大多数的场景,因此一般可以忽略这个参数的配置。而如果服务程序启动后会通过 fork 系统调用创建子进程,然后关闭应用程序本身进程的情况,则应该将 Type 的值设置为 forking,否则 systemd 将不会跟踪子进程的行为,而认为服务已经退出。 | |
Environment | 为服务添加环境变量 | Environment=GITHUB_CLIENT_ID=xxxxxx 或 Environment=”OPTIONS=-f /etc/mongod.conf” |
EnvironmentFile | 指定加载一个包含服务所需的环境变量列表的文件,文件中的每一行都是一个环境变量的定义。 | EnvironmentFile=/etc/sysconfig/rsyncd 或 EnvironmentFile=-/etc/sysconfig/sshd |
ExecStart | 这个参数是几乎每个 .service 文件都会有的,指定服务启动的主要命令,在每个配置文件中只能使用一次。需要使用绝对路径 | ExecStart=/usr/bin/mongod $OPTIONS |
ExecStartPre | 指定在启动执行 ExecStart 的命令前的准备工作,可以有多个,所有命令会按照文件中书写的顺序依次被执行。 | ExecStartPre=/usr/bin/mkdir -p /var/run/mongodb |
ExecStartPost | 指定在启动执行 ExecStart 的命令后的收尾工作,也可以有多个。 | ExecStartPost=-/sbin/augenrules –load |
ExecStop | 停止服务所需要执行的主要命令。需要使用绝对路径 | ExecStop=/usr/libexec/redis-shutdown redis-sentinel |
ExecStopPost | 指定在 ExecStop 命令执行后的收尾工作,也可以有多个。 | ExecStopPost=/bin/rm -f /.unconfigured |
ExecReload | 重新加载服务所需执行的主要命令。需要使用绝对路径 | ExecReload=/usr/sbin/postfix reload |
Restart | 这个值用于指定在什么情况下需要重启服务进程。常用的值有 no,on-success,on-failure,on-abnormal,on-abort 和 always。默认值为 no,即不会自动重启服务。这些不同的值分别表示了在哪些情况下,服务会被重新启动 | Restart=on-failure |
RestartSec | 如果服务需要被重启,这个参数的值为服务被重启前的等待秒数。 | RestartSec=42s |
Nice | 服务的进程优先级,值越小优先级越高,默认为0。-20为最高优先级,19为最低优先级。 | |
WorkingDirectory | 指定服务的工作目录。 | WorkingDirectory=/root |
RootDirectory | 指定服务进程的根目录( / 目录),如果配置了这个参数后,服务将无法访问指定目录以外的任何文件。 | |
User | 指定运行服务的用户,会影响服务对本地文件系统的访问权限。 | User=mongod |
Group | 指定运行服务的用户组,会影响服务对本地文件系统的访问权限。 | Group=mongod |
PrivateTmp | 是否给服务分配独立的临时空间(true/false) | PrivateTmp=true |
注1:执行命令全部要求使用绝对路径
注2:所有的启动设置之前,都可以加上一个连词号(-),表示”抑制错误”,即发生错误的时候,不影响其他命令的执行
注3:通过一下命令查询服务是如何使用某参数的:grep -r “Group” /usr/lib/systemd/system/
【Install】
Install区块,定义如何安装这个配置文件
参数 | 说明 | 示例 |
---|---|---|
WantedBy | 和前面的 Wants 作用相似,只是后面列出的不是服务所依赖的模块,而是依赖当前服务的模块。“WantedBy=multi-user.target” 表明当系统以多用户方式(默认的运行级别)启动时,这个服务需要被自动运行。当然还需要 systemctl enable 激活这个服务以后自动运行才会生效 | WantedBy=multi-user.target |
RequiredBy | 和前面的 Requires 作用相似,同样后面列出的不是服务所依赖的模块,而是依赖当前服务的模块。 | |
Also | 当这个服务被 enable/disable 时,将自动 enable/disable 后面列出的每个模块。 | Also=NetworkManager-dispatcher.service |