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