Linux --- Service
一、概要
1. 环境
(1) Rocky Linux 9.1
2. systemd
systemd是Linux系统下的服务(Service)管理工具,从RHEL 7开始systemd作为默认的系统管理工具。它具备以下功能:
(1) 按需操作(启动/停止/重启)守护进程;
(2) 在系统启动时并行的启动守护进程;
(3) 守护进程依赖管理。
3. systemd units
systemd的一个重要概念就是单元(systemd units)。
(1) systemd units所在的不同目录代表不同的units:
/usr/lib/systemd/system/: 该目录存放由RPM包安装时产生的unit文件;
/run/systemd/system/: 存放在运行时创建的unit文件,这里的unit文件可以覆盖安装时产生的unit文件;
/etc/systemd/system/: 存放由"systemctl enable"创建的unit文件以及由个人手动创建的unit文件;
(2) systemd unit的不同类型:
Unit Type | File Extension | Description |
Service unit | .service | 系统服务 |
Target unit | .target | systemd units组 |
Automount unit | .automount | 文件系统自动挂载点 |
Device unit | .device | 设备文件 |
Mount unit | .mount | 文件系统挂载点 |
二、Service Unit
1. 组成
一个xxx.service文件由三部分组成,分别是[Unit],[Service],[Install]。
[Unit]: 该部分的内容与unit类型无关,包含描述、对其他unit的依赖和unit行为;
[Service]: 这部分包含于unit类型相关的配置信息;
[Install]: 这部分的内容与使用命令"systemd enable/disable"安装相关;
2. [Unit]
Description: 描述信息,运行"systemctl status"时会显示该配置;
Documentation: 当前Unit文档的URL链接;
After/Before: 该Unit依赖的前置/后置Unit;
Requires: 当前Unit依赖的unit文件,如果找不到该文件则启动失败;
Wants: 弱依赖,如果没有找到该依赖,服务也可以启动;
Conflicts: 反向依赖,不能与当前unit共存的依赖;
例子:
[Unit] Description=Postfix Mail Transport Agent After=syslog.target network.target Conflicts=sendmail.service exim.service
3. [Service]
(1) Service Type: 服务类型,包含以下类型:
simple: 默认类型,系统将ExecStart对应的命令作为主进程;
forking: 服务启动时会有两个进程,一个是主进程会在启动之后退出;另一个是子进程对应ExecStart的配置,会在启动之后变成主进程;
Oneshot: 与simple类型,但是执行完成之后就退出;
此外,还有dbus、notify和idle类型。
(2) ExecStart: 当服务启动时需要执行的命令行;
此外,ExecStartPre和ExecStartPost与ExecStart相对应,它们分别于ExecStart之前和之后被执行。
(3) ExecStop: 服务被关闭时执行的命令行;
(4) ExecReload: 服务被Reload时需要执行的命令行;
(5) Restart: 服务被重启时需要执行的命令行;
(6) RemainAfterExit: 默认为false,如果设置为true则即使服务所对应的所有进程全部退出,该服务也会维持active状态。
该配置项在Service Type=Oneshot时比较有用。
(7) 例子
[Service] Type=forking PIDFile=/var/spool/postfix/pid/master.pid EnvironmentFile=-/etc/sysconfig/network ExecStartPre=-/usr/libexec/postfix/aliasesdb ExecStartPre=-/usr/libexec/postfix/chroot-update ExecStart=/usr/sbin/postfix start ExecReload=/usr/sbin/postfix reload ExecStop=/usr/sbin/postfix stop
4. [Install]
(1) Alias: 服务的别名,可用空格分割多个别名;
(2) RequiredBy: 依赖的服务列表,
(3) WantedBy
(4) Also: 指定其他需要与当前unit一起安装或卸载的unit;
5. 创建服务
(1) 创建服务文件
sudo touch /etc/systemd/system/example.service
(2) 赋权
sudo chmod 664 /etc/systemd/system/example.service
(3) 初始化
[Unit] Description=An example service [Service] Type=forking ExecStart=/usr/bin/emacs --daemon ExecStop=/usr/bin/emacsclient --eval "(kill-emacs)" Environment=SSH_AUTH_SOCK=%t/keyring/ssh Restart=always [Install] WantedBy=default.target
(4) 加载启动
sudo systemctl daemon-reload sudo systemctl enable --now example.service
三、参考
https://blog.thenets.org/how-to-create-a-service-for-fedora-rhel/
https://www.golinuxcloud.com/create-systemd-service-example/