「systemd」- 修改单元文件 @20210318

问题描述

系统安装某个服务,但是需要修改它的单元文件的参数。

由于这些服务是通过包管理器安装的,比如 YUM 安装,不建议直接修改包中的文件。因为随着软件的升级,该单元文件会被覆盖或者删除,因此不应该直接修改属于软件包的文件。

比如,安装了MySQL服务,单元文件/usr/lib/systemd/system/mysqld.service为包中自带的,但是我们需要调整它的配置。而你应该直接修改这个文件,因为:如果升级MySQL版本,该文件会被覆盖。

标准操作

正确的做法是使用 systemctl edit 命令。

基于上面的例子,执行systemctl edit mysqld.service命令,该会打开编辑器,你可以在这其中输入自定义配置,例如:

[Service]
LimitNOFILE=65535

然后保存退出。

实际上,上面的操作流程就是:创建了/etc/systemd/system/mysqld.service.d/override.conf文件,并将编辑器的内容写入到override.conf文件中。你也可以在定义自己的.conf文件。

!!!另外有几个需要注意的地方:
(1)当使用systemctl edit命令进行修改的时候,需要指定章节,比如示例中的[Service]部分。
(2)覆盖是以指令单位的。例如,上面虽然指定了[Service]部分,但是只会覆盖[Service]部分的LimitNOFILE配置。
(3)如果它是一个列表,那你需要清空在定义。比如,先指定LimitNOFILE=后指令,再指定LimitNOFILE=65535指令。
(4)不需要运行systemctl daemon-reload命令。

查看修改

执行systemctl cat命令来查看修改。

例如执行systemctl cat mysqld.service命令,会产生类似如下的输出:

#
# /usr/lib/systemd/system/mysqld.service
#
# Simple MySQL systemd service file
#
# systemd supports lots of fancy features, look here (and linked docs) for a full list:
#   http://www.freedesktop.org/software/systemd/man/systemd.exec.html
#
# Note: this file ( /usr/lib/systemd/system/mysql.service )
# will be overwritten on package upgrade, please copy the file to
#
#  /etc/systemd/system/mysql.service
#
# to make needed changes.
#
# systemd-delta can be used to check differences between the two mysql.service files.
#

[Unit]
Description=MySQL Community Server
After=network.target
After=syslog.target

[Install]
WantedBy=multi-user.target
Alias=mysql.service

[Service]
User=mysql
Group=mysql

# Execute pre and post scripts as root
PermissionsStartOnly=true

# Needed to create system tables etc.
ExecStartPre=/usr/bin/mysql-systemd-start pre

# Start main service
ExecStart=/usr/bin/mysqld_safe --basedir=/usr

# Don't signal startup success before a ping works
ExecStartPost=/usr/bin/mysql-systemd-start post

# Give up if ping don't get an answer
TimeoutSec=600

Restart=always
PrivateTmp=false



# /etc/systemd/system/mysqld.service.d/override.conf
[Service]
LimitNOFILE=65535

它同时输出了哪些指令是来自于/usr/lib/systemd/system/mysqld.service文件,哪些是来自于/etc/systemd/system/mysqld.service.d/override.conf文件。

关于环境变量

环境变量的修改也是类似的方法,但是使用的是Environment指令,如同Environment=FOO=bar的形式。

还原修改

执行systemctl revert命令来还原修改。它会还原至原始版本,删除所有的覆盖,还原单元文件的属性到默认值,并且进行unmask操作。

执行systemctl revert mysqld.service命令来还原之前的修改。

!!!但是要高于229版本(systemctl --version),而CentOS Linux release 7.4.1708 (Core)是systemd 219版本。

相关文章

「systemd」- 从 systemctl status 中提取个别字段
「Supervisor」- 创建首个配置文件
「systemd」 - 创建和修改单元文件
「systemd.timer」

参考文献

How do I override or configure systemd services?
Systemd delete overrides
systemd.unit — Unit configuration
How to override systemd unit file settings?
How to find out the systemd version on Raspbian

上一篇:prometheus + granfana


下一篇:(计算机组成原理题目题型总结)第一章:计算机系统概述:题目