首页 > 系统相关 >Linux基础 - 服务管理 Unit配置文件

Linux基础 - 服务管理 Unit配置文件

时间:2023-02-19 19:12:41浏览次数:56  
标签:bin 服务 配置文件 Unit 当前 Linux 模板 usr

 

一、 配置文件的格式

1. 配置文件的区块名和字段名,都是大小写敏感的。

2. 每个区块内部是一些等号连接的键值对,键值对的等号两侧不能有空格。

[root@cl-server ~]# systemctl cat emqx.service
# /usr/lib/systemd/system/emqx.service
[Unit]
Description=emqx daemon
After=network.target

[Service]
User=emqx
Group=emqx
Type=forking
Environment=HOME=/var/lib/emqx
ExecStart=/bin/sh /usr/bin/emqx start
LimitNOFILE=1048576
ExecStop=/bin/sh /usr/bin/emqx stop

[Install]
WantedBy=multi-user.target

  

二、 配置文件的区块

[Unit]区块: 用来定义 Unit 的元数据,以及配置与其他 Unit 的关系

Description:       简短描述
Documentation:     文档地址
Requires:          当前 Unit 依赖的其他 Unit,如果它们没有运行,当前 Unit 会启动失败
Wants:             与当前 Unit 配合的其他 Unit,如果它们没有运行,当前 Unit 不会启动失败
BindsTo:           与Requires类似,它指定的 Unit 如果退出,会导致当前 Unit 停止运行
Before:            如果该字段指定的 Unit 也要启动,那么必须在当前 Unit 之后启动
After:             如果该字段指定的 Unit 也要启动,那么必须在当前 Unit 之前启动
Conflicts:         这里指定的 Unit 不能与当前 Unit 同时运行
Condition...:      当前 Unit 运行必须满足的条件,否则不会运行
Assert...:         当前 Unit 运行必须满足的条件,否则会报启动失败

 

[Install]区块: 通常是配置文件的最后一个区块,用来定义如何启动,以及是否开机启动。

WantedBy:     它的值是一个或多个 Target,当前 Unit 激活时(enable)符号链接会放入/etc/systemd/system目录下面以 Target 名 + .wants后缀构成的子目录中
RequiredBy:   它的值是一个或多个 Target,当前 Unit 激活时,符号链接会放入/etc/systemd/system目录下面以 Target 名 + .required后缀构成的子目录中
Alias:        当前 Unit 可用于启动的别名
Also:         当前 Unit 激活(enable)时,会被同时激活的其他 Unit

  

[Service]区块: 用来 Service 的配置,只有 Service 类型的 Unit 才有这个区块。它的主要字段如下。

Type:          定义启动时的进程行为。
ExecStart:     启动当前服务的命令
ExecStartPre:  启动当前服务之前执行的命令
ExecStartPost: 启动当前服务之后执行的命令
ExecReload:    重启当前服务时执行的命令
ExecStop:      停止当前服务时执行的命令
ExecStopPost:  停止当其服务之后执行的命令
KillMode: 定义服务如何停止
PIDFile: PID的存放文件, 绝对路径 RestartSec: 自动重启当前服务间隔的秒数 Restart: 定义何种情况 Systemd 会自动重启当前服务,可能的值包括always(总是重启)、on-success、on-failure、on-abnormal、on-abort、on-watchdog TimeoutSec: 定义 Systemd 停止当前服务之前等待的秒数
PrivateTmp: 给服务分配独立的临时空间 Environment: 指定环境变量 EnvironmentFile: 指定加载一个包含服务所需的环境变量的列表的文件,文件中的每一行都是一个环境变量的定义 Nice: 服务的进程优先级,值越小优先级越高,默认为 0。其中 -20 为最高优先级,19 为最低优先级 WorkingDirectory: 指定服务的工作目录 RootDirectory: 指定服务进程的根目录(/ 目录)。如果配置了这个参数,服务将无法访问指定目录以外的任何文件 User: 指定运行服务的用户 Group: 指定运行服务的用户组 MountFlags: 服务的Mount Namespace配置,会影响进程上下文中挂载点的信息,即服务是否会继承主机上已有挂载点,以及如果服务运行执行了挂载或卸载设备的操作,是否会真实地在主机上产生效果。可选值如下 shared: 服务与主机共用一个 Mount Namespace,继承主机挂载点,且服务挂载或卸载设备会真实地反映到主机上 slaved: 服务使用独立的 Mount Namespace,它会继承主机挂载点,但服务对挂载点的操作只有在自己的 Namespace 内生效,不会反映到主机上 private:服务使用独立的 Mount Namespace,它在启动时没有任何任何挂载点,服务对挂载点的操作也不会反映到主机上 LimitCPU / LimitSTACK / LimitNOFILE / LimitNPROC 等: 限制特定服务的系统资源量,例如 CPU、程序堆栈、文件句柄数量、子进程数量等

  

三、Service区块详解

在 ExecStart、ExecStop 等属性中使用了 Linux 命令, 则必须要写出完整的绝对路径。
对 ExecStartPre 和 ExecStartPost 等辅助命令, 若前面有个 "-" 符号, 表示忽略这些命令的出错。
因为有些"辅助"命令本来就不一定成功, 比如尝试清空一个文件,但文件可能不存在。

 

3.1 Type类型

  • Type=simple:   默认值,执行ExecStart指定的命令,启动主进程; 服务进程不会fork
  • Type=forking:  以 fork 方式从父进程创建子进程,创建后父进程会立即退出, 后台运行; 指定PIDFile文件, 以便 Systemd 能够跟踪服务的主进程
  • Type=oneshot:  一次性进程,Systemd 会等当前服务退出,再继续往下执行; 需要指定RemainAfterExit=yes, 以便Systemd在服务退出后仍认为服务处于激活状态
  • Type=dbus:     当前服务通过D-Bus启动; 当指定的 BusName 出现在 DBus 系统总线上时,Systemd认为服务就绪
  • Type=notify:   当前服务启动完毕,会通知Systemd,再继续往下执行
  • Type=idle:     若有其他任务执行完毕,当前服务才会运行

 

3.2 Restart

  • no:           # 默认, 退出后无操作
  • on-success:   # 只有正常退出时(退出状态码为0),才会重启
  • on-failure:   # 非正常退出时,重启,包括信号终止和超时; 对于守护进程,推荐使用on-failure
  • on-abnaomal:  #只有信号终止或超时,才会重启
  • on-abort :    # 只有在收到没有捕捉到信号终止时,才会重启
  • on-watchdog:  # 超市退出时,才会重启
  • always:       # 不管什么退出原因,都会重启

 

3.3 Environment/EnvironmentFile

后面接多个不同的shell变量。例如:

  • Environment=DATA_DIR=/data/elk
  • Environment=LOG_DIR=/var/log/elasticsearch
  • Environment=PID_DIR=/var/run/elasticsearch

EnvironmentFile=-/etc/sysconfig/elasticsearch

连词号(-):在所有启动设置之前,添加的变量字段,都可以加上连词号 表示抑制错误,即发生错误时,不影响其他命令的执行。
比如EnviromentFile=-/etc/sysconfig/xxx表示即使文件不存在,也不会抛异常

 

3.4 KillMode

  • contorl-group: 默认, 当前控制组里所有的子进程都会被杀掉
  • process:       只杀主进程
  • mixed:         主进程将收到SIGTERM(终止进程)信号,子进程将收到SIGKILL(无条件终止)信号
  • none:          没有进程会被杀掉,只是执行服务的stop命令

 

四、Unit文件占位符和模板

4.1 文件占位符

在 Unit 文件中,有时会需要使用到一些与运行环境有关的信息,例如节点ID、运行服务的用户等。这些信息可以使用占位符来表示,然后在实际运行时动态地替换成实际的值。

%n:  完整的 Unit 文件名字,包括 .service 后缀名
%p:  Unit 模板文件名中 @ 符号之前的部分,不包括 @ 符号
%i:  Unit 模板文件名中 @ 符号之后的部分,不包括 @ 符号和 .service 后缀名
%t:  存放系统运行文件的目录,通常是 “run”
%u:  运行服务的用户,如果 Unit 文件中没有指定,则默认为 root
%U:  运行服务的用户 I
%h:  运行服务的用户 Home 目录,即 %{HOME} 环境变量的值
%s:  运行服务的用户默认 Shell 类型,即 %{SHELL} 环境变量的值
%m:  实际运行节点的 Machine ID,对于运行位置每个的服务比较有用
%b:  Boot ID,这是一个随机数,每个节点各不相同,并且每次节点重启时都会改变
%H:  实际运行节点的主机名
%v:  内核版本,即 "uname -r" 命令输出的内容
%%:  在 Unit 模板文件中表示一个普通的百分号

  

4.2 模板

在现实中,往往有一些应用需要被复制多份运行。例如,用于同一个负载均衡器分流的多个服务实例,或者为每个 SSH 连接建立一个独立的 sshd 服务进程。

Unit 模板文件的写法与普通的服务 Unit 文件基本相同,不过 Unit 模板的文件名是以 @ 符号结尾的。通过模板启动服务实例时,需要在其文件名的 @ 字符后面附加一个参数字符串。

[email protected] 模板

[Unit]
Description=My Advanced Service Template
After=etcd.service docker.service

[Service]
TimeoutStartSec=0
ExecStartPre=-/usr/bin/docker kill apache%i
ExecStartPre=-/usr/bin/docker rm apache%i
ExecStartPre=/usr/bin/docker pull coreos/apache
ExecStart=/usr/bin/docker run --name apache%i -p %i:80 coreos/apache /usr/sbin/apache2ctl -D FOREGROUND
ExecStartPost=/usr/bin/etcdctl set /domains/example.com/%H:%i running
ExecStop=/usr/bin/docker stop apache1
ExecStopPost=/usr/bin/docker rm apache1
ExecStopPost=/usr/bin/etcdctl rm /domains/example.com/%H:%i

[Install]
WantedBy=multi-user.target

  

4.3 启动 Unit 模板的服务实例
在服务启动时需要在 @ 后面放置一个用于区分服务实例的附加字符参数,通常这个参数用于监控的端口号或控制台 TTY 编译号。

# systemctl start [email protected]

Systemd 在运行服务时,总是会先尝试找到一个完整匹配的 Unit 文件,如果没有找到,才会尝试选择匹配模板。

例如上面的命令,System 首先会在约定的目录下寻找名为 [email protected] 的文件,如果没有找到,而文件名中包含 @ 字符,它就会尝试去掉后缀参数匹配模板文件。

对于 [email protected], systemd 会找到 [email protected] 模板文件,并通过这个模板文件将服务实例化。

 

 

标签:bin,服务,配置文件,Unit,当前,Linux,模板,usr
From: https://www.cnblogs.com/kingdomer/p/16919274.html

相关文章

  • Linux基础 - 服务管理 systemctl
     一、UnitSystemd可以管理所有系统资源,不同的资源统称为Unit(单位)。Unit一共分成12种。Serviceunit:  系统服务, 封装守护进程的启动、停止、重启和重载操作......
  • Linux基础 - 服务管理 systemd
     一、systemd引入1.1sysv引导启动Linux的启动之前采用init进程。启动服务:servicehttpdstart或/etc/init.d/httpdstartinit这种方法有两个缺点。一是启动时......
  • linux limits.conf 生效,linux修改limits.conf不生效
    正常情况下,/etc/security/limits.conf的改动,应该在下次访问时就生效才对。一、修改方法1.临时方法为了优化linux性能,可能需要修改这个最大值。临时修改的话ulimit-n......
  • Linux/VScode搭建Rust开发环境
    1、Linux下搭建Rust开发环境1.1、使用Rustup安装  执行如下命令curl--proto'=https'--tlsv1.2-sSfhttps://sh.rustup.rs|sh  执行结果如下:  在这里使用......
  • Linux系统之时间管理
    (Linux系统之时间管理)一、date命令介绍1.date帮助[root@tianyi~]#dateMonSep620:56:57CST2021[root@tianyi~]#date--helpUsage:date[OPTION]...[+FORM......
  • LVS(Linux Virtual Server)+Nginx 高可用集群
    LVS(Linux虚拟服务器)LVS(LinuxVirtualServer)是一个开源的负载均衡项目,是国内最早出现的开源项目之一,目前已被集成到Linux内核模块中。该项目在Linux内核中实现了基于......
  • 68、Linux DNS实现
    DNS软件LINUXDNS软件bindbind:服务器bind-lib:相关库bind-utils:客户端bind-chroot:安全包,将DNS相关文件放置/var/named/chroot配置文件BIND主程序:/usr/sbin/named服务脚本......
  • Linux基础 - 进程管理 ps
     psaux|sort-k4,4nr|head-n10 #查看内存占用前10名的程序ps-e/ps-ef/ps-eF/ps-ely  #Toseeeveryprocessonthesystemusingstandardsy......
  • Linux系统的日志管理
    (Linux系统的日志管理)一、systemd-journald服务1.systemd-journald介绍#系统时间日志的核心服务#收集包括来自内核,早期引导阶段啊,进程启动,运行时的标准输出和错误输......
  • Linux系列教程(十四)——Linux用户和用户组管理之相关配置文件
    前面我们介绍了软件包管理。首先介绍了rpm包的相关命令,但是我们发现直接安装rpm包会被其依赖性折磨的不行,然后解决办法是yum在线管理,通过yum命令安装rpm包能自动帮助我......