问题描述
系统安装某个服务,但是需要修改它的单元文件的参数。
由于这些服务是通过包管理器安装的,比如 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