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/

posted @ 2023-03-21 22:01  白马黑衣  阅读(972)  评论(0编辑  收藏  举报