zl程序教程

您现在的位置是:首页 >  其他

当前栏目

Systemd 及 Service 文件含义解析

文件 解析 Service 含义 systemd
2023-06-13 09:13:17 时间

joseph

#9733 VIP

Systemd 及 Service 文件含义解析

joseph

· · 107 次点击 ·
·
开始浏览    

这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。 Systemd 是 Linux下的一款系统和服务管理器,兼容 SysV 和 LSB 的启动脚本。Systemd 的特性有:支持并行化任务;同时采用socket式 与 D-Bus 总线式激活服务;按需启动守护进程(daemon);利用 Linux 的 cgroups 监视进程;支持快照和系统恢复;维护挂载点和自动挂载点;各服务间基于依赖关系进行精密控制。

其中的监视和控制功能的主要命令就是systemctl。

Systemd 有很多不同类型的使用单元,主要包括:系统服务(.service)、挂载点(.mount)、sockets(.sockets)、系统设备(.device)、交换分区(.swap)、文件路径(.path)、启动目标(.target)。一般我们常用的是其中的系统服务。

对于系统服务而言,比较重要的就是其中的 service 文件。我们先来看一个httpd.service文件,所在目录: /usr/lib/systemd/system/。其实单元文件可以从两个地方进行加载,优先级从低到高分别是:

* /usr/lib/systemd/system/ :软件包安装的单元
* /etc/systemd/system/ :系统管理员安装的单元

Httpd.service 文件样例:

`
[Unit]
Description=The Apache HTTP Server
After=network.target remote-fs.targetnss-lookup.target
Documentation=man:httpd(8)
Documentation=man:apachectl(8)

[Service]
Type=notify
EnvironmentFile=/etc/sysconfig/httpd
ExecStart=/usr/sbin/httpd $OPTIONS-DFOREGROUND
ExecReload=/usr/sbin/httpd $OPTIONS -kgraceful
ExecStop=/bin/kill -WINCH ${MAINPID}
# We want systemd to give httpd some timeto finish gracefully, but still want
# it to kill httpd after TimeoutStopSec ifsomething went wrong during the
# graceful stop. Normally, Systemd sendsSIGTERM signal right after the
# ExecStop, which would kill httpd. We aresending useless SIGCONT here to give
# httpd time to finish.
KillSignal=SIGCONT
PrivateTmp=true

[Install]
WantedBy=multi-user.target
`

这个文件由三个部分组成:Unit、Service、Install。

[Unit] 主要是为了解决依赖关系。常见的添加 Requires、After,如果这个依赖是可选的,那么是 Wants、After。依赖关系通常被用在服务(service)而不是(target)上,所以上述的 httpd 所依赖的仅仅是一些 target,因而也就没有 Requires 和 Wants 出现。

[Service] 可选择几种不同的服务启动方式,启动方式通过Type参数进行设置。

* Type=simple(默认值):systemd认为该服务将立即启动。服务进程不会fork。如果该服务要启动其他服务,不要使用此类型启动,除非该服务是socket激活型。
* Type=forking:systemd认为当该服务进程fork,且父进程退出后服务启动成功。对于常规的守护进程(daemon),除非你确定此启动方式无法满足需求,使用此类型启动即可。使用此启动类型应同时指定 PIDFile=,以便systemd能够跟踪服务的主进程。
* Type=oneshot:这一选项适用于只执行一项任务、随后立即退出的服务。可能需要同时设置 RemainAfterExit=yes 使得 systemd 在服务进程退出之后仍然认为服务处于激活状态。
* Type=notify:与 Type=simple 相同,但约定服务会在就绪后向 systemd 发送一个信号。这一通知的实现由 libsystemd-daemon.so 提供。
* Type=dbus:若以此方式启动,当指定的 BusName 出现在DBus系统总线上时,systemd认为服务就绪。

修改现存单元文件

要更改由软件包提供的单元文件,先创建名为 /etc/systemd/system/ 单元名 .d/ 的目录(如/etc/systemd/system/httpd.service.d/),然后放入 *.conf文件,其中可以添加或重置参数。这里设置的参数优先级高于原来的单元文件。

例如,如果想添加一个额外的依赖,创建这么一个文件即可:

/etc/systemd/system/ unit .d/customdependency.conf
`
[Unit]
Requires= 新依赖
After= 新依赖
`

然后运行以下命令使更改生效:

`
# systemctl daemon-reload
# systemctl restart 单元
`

此外,把旧的单元文件从 /usr/lib/systemd/system/ 复制到/etc/systemd/system/,然后进行修改,也可以达到同样效果。

`systemctl enable 单元 `

在 /etc/systemd/system/ 目录中的单元文件的优先级总是高于 /usr/lib/systemd/system/ 目录中的同名单元文件。注意,当/usr/lib/ 中的单元文件因软件包升级变更时,/etc/ 中自定义的单元文件不会同步更新。此外,你还得执行 systemctl reenable unit ,手动重新启用该单元。因此,建议使用前面一种利用 *.conf 的方法。

可以使用 journalctl 来查看 systemd 管理服务的启动日志:
`
journalctl -b -0 # 显示本次启动的信息
journalctl -b -1 # 显示上次启动的信息
`

参考阅读 ArchLinux 的 Systemd (简体中文) 文档:https://wiki.archlinux.org/index.php/Systemd_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)

107 次点击  
加入收藏