一、什么是.service文件?
Linux中.service文件是某项服务对应的配置文件,可用于systemd管理和控制的服务的设置。
.service 文件通常包含3个模块:
[Unit] 控制单元,表示启动顺序和依赖关系。
[Service] 服务,表示服务的定义。
[Install] 安装,表示如何安装配置文件。
*注:service配置文件字段详解见尾部的 附录*
例如:Todesk开机自启服务
[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)
二、如何管理.service文件?(实现脚本或者程序开机自启)
1.service存放位置
.service 文件配置的服务常用systemd管理,然而,systemd有系统和用户区分:
系统(/user/lib/systemd/system/) ARM的可能是/usr/lib/systemd/system
用户(/etc/lib/systemd/)
一般系统管理员手工创建的单元文件建议存放在/etc/systemd/system/目录下面。我们的todeskd.service是放在/etc/systemd/system/下的。
2.设置服务开机自启
将.service文件放到/etc/systemd/system/后,使用systemctl enable todeskd.service命令用于设置开机自启服务,原理其实就是在上面两个目录之间,建立符号链接关系。即会在/etc/systemd/system/multi-user.target.wants/的目录下新建一个/usr/lib/systemd/system/todeskd.service文件的链接。
3.启动服务
使用systemctl start todeskd.service命令,启动todesk服务,此时可以查看ToDesk_Service有没有在后台运行:ps -aux | grep ToDesk_Service
如果程序正常在后台启动了,那么你就可以重启系统检验一下程序有没有开机自启!
三、service服务相关操作指令
1.修改配置文件后重启
重新加载配置文件
sudo systemctl daemon-reload
重启相关服务
sudo systemctl restart 服务名
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
每个配置文件的状态,一共有四种。
- enabled:已建立启动链接;表示允许开机启动
- disabled:没建立启动链接;表示禁止开机启动
- static:该配置文件没有[Install]部分(无法执行),只能作为其他配置文件的依赖
- masked:该配置文件被禁止建立启动链接
显示service服务的状态
systemctl status todeskd.service
- Loaded行:配置文件的位置,是否设为开机启动
- Active行:表示正在运行
- Main PID行:主进程ID
- Status行:由应用本身(这里是 httpd )提供的软件当前状态
- CGroup块:应用的所有子进程
- 日志块:应用的日志
Active行:
active(running) 表示程序正在执行;
atcive(exited) 执行一次就正常退出的服务,不在系统中执行任何程序;
active(waiting) 正在执行中,处于阻塞状态,需要等待其他程序执行完才能执行;
inactive (dead) 未启动状态;
附录:
service配置文件字段详解
**[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 运行必须满足的条件,否则会报启动失败
**[Service]**区块用来 Service 的配置,只有 Service 类型的 Unit 才有这个区块。它的主要字段如下。
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
[参考链接]
https://blog.csdn.net/w2009211777/article/details/125489179
https://blog.csdn.net/weixin_33768481/article/details/89770056
https://blog.csdn.net/a913909626/article/details/118405378
https://www.cnblogs.com/q149072205/p/11541693.html
https://blog.csdn.net/liuchonghua/article/details/81743606
https://www.cnblogs.com/zwcry/p/9602756.html
https://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-commands.html
https://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-part-two.html
感谢!
版权归原作者 xiaohai@Linux 所有, 如有侵权,请联系我们删除。