linux systemd service 服务文件简介

目录

实现流程

创建.service文件

概念

命令

控制单元(Unit)

服务定义(service)

Type

Environment

EnvironmentFile

PIDFile

ExecStart

ExecStop

ExecStartPre

ExecStartPost

ExecStopPost

KillMode

Restart

SuccessExitStatus

RestartSec

WorkingDirectory

User

PrivateTmp

安装部分(Install)

WantedBy

RequiredBy

Alias

Also

Target

概念

命令


实现流程

创建.service文件

创建ping@.service文件,内容可以如下:

[Unit]
Description=ping daemon
After=network.target 

[Service]
Restart=on-failure
ExecStart=/usr/bin/ping 127.0.0.%d
ExecReload=/bin/kill -s -HUP $MAINPID               
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
KillMode=none                  
LimitCORE=infinity

[Install]
WantedBy=multi-user.target 

文件迁移

将.service文件拷贝至/usr/lib/systemd/system/下

cp ping@.service /usr/lib/systemd/system/

加载配置

systemctl daemon-reload

调用服务

# 启动服务
systemctl start ping@1

# 查看服务进程
ps –aux | grep ping

systemctl

概念

systemctl是一个systemd工具,负责控制systemd系统和管理系统服务。

命令

#当新增或修改service单元文件时,需要系统重新加载所有修改过的配置文件
systemctl daemon-reload

#设置为开机自启动
systemctl enable RegisterCenter

#关掉开机启用
systemctl disable RegisterCenter

#启动服务
systemctl start RegisterCenter

#重启服务,相当于先stop,再start
systemctl restart RegisterCenter

#关闭服务,关闭服务后,进程会全部被kill掉
systemctl stop RegisterCenter

#查看服务的状态
systemctl status RegisterCenter

#查看服务是否开机启动
systemctl is-enabled RegisterCenter

#查看已启动的服务列表
systemctl list-unit-files|grep enabled
#
显示所有已启动的服务
systemctl list-units --type=service

#查看启动失败的服务列表
systemctl --failed

# 杀死一个服务的所有子进程
systemctl kill RegisterCenter

# 重新加载一个服务的配置文件
systemctl reload RegisterCenter

#移除标记为丢失的 Unit 文件。在删除 Unit 文件后,由于缓存的关系,
#即使通过 daemon-reload 更新了缓存,在 list-units 中依然会显示标记为 not-found 的 Unit
systemctl reset-failed RegisterCenter

service文件组成

控制单元(Unit)

主要包括服务描述、启动顺序和依赖关系。

Description:当前服务的简单描述;

Documentation:文档位置;

After:在什么服务之后启动;

Before:在什么服务之前启动;

说明:After和Before字段只涉及启动顺序,不涉及依赖关系。
 

Wants:表示“弱依赖”关系。某服务停止运行或退出不影响该服务继续运行;

Requires:表示”强依赖”关系。列在其中的Uint模块会在这个服务启动的同时被启动,如果其中任意一个启动失败,这个服务会被终止。某服务停止运行或退出,该服务也必须停止运行。

说明:Wants字段与Requires字段只涉及依赖关系,与启动顺序无关,默认情况下是同时启动的。
 

PartOf:该参数仅用于单元的停止或重启。

服务定义(service)

Type

定义启动类型。可设置的值如下:

simple(默认值):ExecStart字段启动的进程为主进程;

forking:ExecStart字段以fork()方式启动,父进程退出后,子进程将成为主进程;

oneshot:类似于simple,但只执行一次,Systemd 会等它执行完,才启动其他服务;

dbus:类似于simple,但会等待 D-Bus 信号后启动;;

notify:类似于simple,启动结束后会发出通知信号,然后 Systemd 再启动其他服务;

idle:类似于simple,但是要等到其他任务都执行完,才会启动该服务。一种使用场合是为让该服务的输出,不与其他服务的输出相混;

Environment

为服务设置环境变量

EnvironmentFile

加载包含服务所需环境变量参数的文件。

PIDFile

该服务PID文件的路径(一般位于 /run/ 目录下)。 建议在 Type=forking 的情况下明确设置此选项。 如果设为相对路径,那么表示相对于 /run/ 目录。 systemd 将会在此服务启动完成之后,从此文件中读取主服务进程的PID 。 systemd 不会写入此文件,但会在此服务停止后删除它(若仍然存在)。

ExecStart

启动程序时执行的命令。例如:

# %d为启动时需要传入的参数
ExecStart=/usr/bin/ping 127.0.0.%d

ExecReload

重启服务执行的命令。例如:

ExecReload=/bin/kill -s -HUP $MAINPID  

表示终止主进程且不产生core dump,重启服务。

ExecStop

通知服务时执行的命令。例如:

ExecStop=/bin/kill -s QUIT $MAINPID

表示中断退出的方式终止进程且产生core dump,停止服务。

ExecStartPre

启动服务之前执行的命令。

ExecStartPost

启动服务之后执行的命令。

ExecStopPost

停止服务之后执行的命令。

KillMode

定义systemd如何停止sshd服务。设置值如下:

l control-group(默认值):当前控制组里面的所有子进程,都会被杀掉;

l process:只杀主进程;

l mixed:主进程将收到 SIGTERM 信号,子进程收到 SIGKILL 信号;

l none:没有进程会被杀掉,只是执行服务的 stop 命令;

Restart

定义sshd退出后,systemd的重启方式。设置值如下:

no(默认值):退出后不会重启;

on-success:只有正常退出时(退出状态码为0),才会重启;

on-failure:非正常退出时(退出状态码非0),包括被信号终止和超时,才会重启;

on-abnormal:只有被信号终止和超时,才会重启;

on-abort:只有在收到没有捕捉到的信号终止时,才会重启;

on-watchdog:超时退出,才会重启;

always:不管是什么退出原因,总是重启;

说明:对于守护进程,推荐设为on-failure。对于那些允许发生错误退出的服务,可以设为on-abnormal。
 

退出原因/设置值

no

always

on-success

on-failure

on-abnormal

on-abort

on-watchdog

正常退出

退出码不为0

进程被强制杀死

操作超时

看门狗超时

服务出现情况与重启对应表

SuccessExitStatus

额外定义其他的进程"正常退出"状态。 也就是,在退出码"0"、以及表示"正常退出"的 SIGHUP, SIGINT, SIGTERM, SIGPIPE 信号之外, 再额外添加一组表示"正常退出"的退出码或信号。 可以设为一系列以空格分隔的数字退出码或者信号名称, 例如:

SuccessExitStatus=1 2 8 SIGKILL

表示当进程的退出码是 1, 2, 8 或被 SIGKILL 信号终止时, 都可以视为"正常退出"。

如果多次使用此选项, 那么最终的结果将是多个列表的合并。 如果将此选项设为空, 那么先前设置的列表 将被清空。

RestartSec

重启服务之前需要等待的秒数。

WorkingDirectory

指定服务工作目录

User

指定运行服务的用户。

PrivateTmp

设置true表示在进程的文件系统名字空间中挂载私有的/tmp和/var/tmp目录,也就是不与名字空间外的其他进程共享临时目录。这样做会增加进程的临时文件安全性,但同时也让进程之间无法通过/tmp或/var/tmp目录进行通信。

安装部分(Install)

用来定义如何启动以及是否开机启动。

WantedBy

表示该服务所在的Target。 Target的含义是服务组,表示一组服务。“WantedBy=multi-user.target”指的是服务所在的Target是multi-user.target。

multi-user.target是systemd默认启动的Target,表示在这个组里的所有服务,都开机启动。

RequiredBy

依赖当前服务的模块。它的值是一个或多个 target,执行enable命令时,符号链接会放入/etc/systemd/system目录下以 target 名 + .required后缀构成的子目录中。

Alias

当前Unit可用于启动的别名。

Also

当前 Unit 被 enable/disable 时,会被同时操作的其他 Unit

Target

概念

Target 就是一个 Unit 组,包含许多相关的 Unit 。启动某个 Target 的时候,Systemd 就会启动里面所有的 Unit。

命令

# 查看当前系统的所有 Target
$ systemctl list-unit-files --type=target

# 查看一个 Target 包含的所有 Unit
$ systemctl list-dependencies multi-user.target

# 查看启动时的默认 Target
$ systemctl get-default

# 设置启动时的默认 Target
$ systemctl set-default multi-user.target

# 切换 Target 时,默认不关闭前一个 Target 启动的进程,systemctl isolate 命令改变这种行为,关闭前一个 Target 里面所有不属于后一个 Target 的进程

启动流程

读入 /boot 目录下的内核文件;

内核文件加载完之后,开始执行第一个程序/sbin/init 初始化进程,由 Systemd 初始化系统引导,完成相关的初始化工作;

Systemd 执行default.target ,获知设定的启动 target (查看默认 target: systemctl get-default);

Systemd 执行启动 target 对应的单元文件。根据单元文件中定义的[依赖关系](bootup Manager Bootup),传递控制权,依次执行其他 target 单元文件,同时启动每个 target 包含的单元

systemd

 

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值