linux--service

  • 1 介绍
  • 2 补充
  • 2.1 demo命令字介绍
  • 2.2 服务管理
  • 2.3 service配置文件字段
  • [Unit]
  • [Service]
  • [Install]
  • 3 创建流程
  • 3.1 创建文件 ubase.service
  • 3.2 告诉 systemd 读取新的服务文件
  • 3.3 启用我们的 systemd 服务
  • 3.4 查看服务状态
  • 4 示例 ubase.service
  • 参考


1 介绍

  • 简单地说,服务是一个“后台进程”,它根据特定情况启动或停止。不需要手动启动和/或停止它。“systemd 服务文件”是一种以 systemd 能够解析和理解它的格式编写的文件。
  • “systemd 服务文件”实际上称为“systemd 单元”文件。
  • systemd 服务文件包含三个重要且必要的部分。它们是 [Unit][Service][Install]
  • systemd 服务文件的扩展名是 .service,我们使用井号/哈希符号 ( #) 进行单行注释。

2 补充

2.1 demo命令字介绍

[Unit]     控制单元,表示启动顺序和依赖关系。
[Service]  服务,表示服务的定义。
[Install]  安装,表示如何安装配置文件。
[Unit]
Description=ToDesk Daemon Service (服务描述)
After=network-online.target (服务依赖,再这些服务后启动本服务)
Before=nss-lookup.target (服务依赖,再这些服务前启动本服务)
Wants=network-online.target nss-lookup.target (与当前服务配合的其他服务,如果它们没有运行,当前服务不会启动失败)
 
[Service]
Type=simple (默认值,systemd认为该服务将立即启动)
ExecStart=/opt/todesk/bin/ToDesk_Service (启动当前服务的命令)
ExecStop=/bin/kill -SIGINT $MAINPID (停止当前服务时执行的命令)
Restart=on-failure (定义何种情况 Systemd 会自动重启当前服务,当前是仅在服务进程异常退出时重启)
RestartSec=3s (自动重启当前服务间隔的秒数)
User=root (设置进程在执行时使用的用户,当前是root)
 
[Install]
WantedBy=multi-user.target (表示该服务所在的服务组,当前是服务所在的服务组是multi-user.target)

2.2 服务管理

systemctl start 服务名            开启服务
systemctl stop 服务名            关闭服务
systemctl status 服务名     显示状态
systemctl restart 服务名     重启服务
systemctl enable 服务名     开机启动服务
systemctl disable 服务名     禁止开机启动
systemctl daemon-reload 修改服务配置文件后需要重新加载服务
systemctl is-enabled 服务名 查询是否自启动服务
systemctl list-units              查看系统中所有正在运行的服务
systemctl list-unit-files      查看系统中所有服务的开机启动状态
systemctl list-dependencies 服务名        查看系统中服务的依赖关系
systemctl mask 服务名               冻结服务
systemctl unmask 服务名           解冻服务
systemctl set-default multi-user.target     开机时不启动图形界面
systemctl set-default graphical.target      开机时启动图形界面
 systemctl is-active 服务名  显示某个 Unit 是否正在运行
systemctl is-failed 服务名  显示某个 Unit 是否处于启动失败状态
systemctl is-enabled 服务名  显示某个 Unit 服务是否建立了启动链接
systemd-analyze blame  查看每个服务的启动耗时
systemctl list-units  查看当前运行的所有服务
查看服务是否开机启动
systemctl list-unit-files

2.3 service配置文件字段

[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 运行必须满足的条件,否则会报启动失败

[Service]

Type:定义启动时的进程行为。它有以下几种值。
Type=simple:默认值,执行ExecStart指定的命令,启动主进程
Type=forking:以 fork 方式从父进程创建子进程,创建后父进程会立即退出
Type=oneshot:一次性进程,Systemd 会等当前服务退出,再继续往下执行
Type=dbus:当前服务通过D-Bus启动
Type=notify:当前服务启动完毕,会通知Systemd,再继续往下执行
Type=idle:若有其他任务执行完毕,当前服务才会运行
ExecStart:启动当前服务的命令
ExecStartPre:启动当前服务之前执行的命令
ExecStartPost:启动当前服务之后执行的命令
ExecReload:重启当前服务时执行的命令
ExecStop:停止当前服务时执行的命令
ExecStopPost:停止当其服务之后执行的命令
RestartSec:自动重启当前服务间隔的秒数
Restart:定义何种情况 Systemd 会自动重启当前服务,可能的值包括always(总是重启)、on-success、on-failure、on-abnormal、on-abort、on-watchdog
TimeoutSec:定义 Systemd 停止当前服务之前等待的秒数
Environment:指定环境变量

[Install]

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

3 创建流程

3.1 创建文件 ubase.service

在目录下 /lib/systemd/system/ 创建文件 ubase.service。

3.2 告诉 systemd 读取新的服务文件

sudo systemctl daemon-reload
该命令将使 systemd 知道我们新创建的 systemd 服务文件。

3.3 启用我们的 systemd 服务

sudo systemctl enable ubase.service

3.4 查看服务状态

sudo systemctl is-enabled ubase.service

enabled

4 示例 ubase.service

/lib/systemd/system/ubase.service

[Unit]
# 简短描述
Description=ubase service
# 如果该字段指定的 Unit 也要启动,那么必须在当前 Unit 之前启动
After=rc-local.service

[Service]
# 启动当前服务之前执行的命令
#ExecStartPre=
# 执行路径
WorkingDirectory=/opt/sen/bin/
# ExecStart 启动当前服务的命令
# “>/dev/null 2>&1” 程序不输出内容到终端
ExecStart=/opt/sen/bin/ubase
# 杀死进程方式:杀死父进程时同时杀死所有子进程
KillMode=process
# 重启方式
Restart=always
# 自动重启当前服务间隔的时间
RestartSec=3000ms
# 重启限制
# StartLimitInterval=
# 列出的退出码或信号永远不会导致该服务被重启
RestartPreventExitStatus=255
# 默认值,systemd认为该服务将立即启动
Type=simple
# 开启CPU统计功能
CPUAccounting=yes
# 开启内存统计功能
#MemoryAccounting=yes
# 开启进程统计功能
#TasksAccounting=yes
# 开启IO统计功能
#IOAccounting=yes
# 开启访问控制功能
#IPAccounting=yes

[Install]
# 表示该服务所在的服务组,当前是服务所在的服务组是multi-user.target
WantedBy=multi-user.target
# Alias=服务名称.service
Alias=ubase.service