修改systemctl Service配置文件 要在 xxxx.service.d/ 目录下添加 .conf 文件

今天重装VPS, 在备份 xray 和 v2ray 配置文件时候, 因为都是 config.json, 保存的时候就改了下文件名. 比如叫, xray.json, v2ray.json.

恢复时候, 冒出个奇怪的想法, 传上去就不改回 config.json 了, 想通过修改 service 文件来加载 xray.json, v2ray.json

没想到踩了一个systemctl Service配置文件修改的坑。


踩坑过程

以 xray 为例.

在 service xray status 中, 看到了加载的 service 文件. 也看到了实际运行的命令.

service xray status查看加载的service文件
知道了是 /etc/systemd/system/xray.service 这个文件, 实际运行的命令是 
/usr/local/bin/xray run -config /usr/local/etc/xray/config.json

于是我就编辑这个文件

nano /etc/systemd/system/xray.service

修改里面实际执行的命令的部分, 改为加载 xray.json 这个配置文件.

nano改xray.service里的ExecStart命令

重启 service

service xray restart

提醒要重新加载一下.

重启提示daemon-reload,但改动没生效

好, 就按这个提醒重新加载一下.

systemctl daemon-reload

再重启 service.


但是, 不管是实际测试功能, 还是查看 service 状态. 都没有修改生效.

状态显示还在用原来的config.json


寻找原因

一下子想不通为什么会这样, 还以为是自己有什么误操作, 或者是 service 正在运行, 文件被占用, 修改没有实际生效于文件? 于是就开始不断地安装 xray, 停止服务, 修改文件, 检查服务运行状态...


然后... 就不小心地有了新发现.

运行xray官方安装脚本的时候,安装过程中有这么一段。

安装脚本里这段systemd配置是线索

掏出我的微信扫一扫翻译一下.

用微信扫一扫翻译安装脚本里的英文

看来如果要自定义 service 的配置, 应该复制 /etc/systemd/system/xray.service.d/10-donot_touch_single_conf.conf 然后再编辑?

还有一份参考资料? https://www.freedesktop.org/software/systemd/man/latest/systemd.unit.html

那我就去看看.


答案

借助 edge 的全页面翻译和 DeepL.com 的高质量翻译.

查systemd文档搞清楚service.d目录的作用

用Edge全页翻译加DeepL看文档

哦, 原来是这样. 然后又想到, 在查看 service status 时显示了这么一段

status里看到Drop-In配置文件

那么, 我应该先把 /etc/systemd/system/xray.service.d/10-donot_touch_single_conf.conf 复制一下, 新文件名就叫, 比如, customized.conf . 当然你可以取你自己喜欢的文件名.

cd /etc/systemd/system/xray.service.d/
cp 10-donot_touch_single_conf.conf customized.conf

然后编辑 customized.conf , 修改启动命令

复制一份改名为customized.conf再改命令

然后重启服务, 当然也需要重新加载一下.

然后再查看服务状态, 发现启动命令使用的是我们期望的 xray.json , 也看到了 Drop-In 了我们新增的 customized.conf 文件.

重启后确认加载的是xray.json

好了, 到此为止, 我一开始的问题解决了.


========

完


========

后记

.conf 文件的加载顺序

注意到, "多个具有不同名称的 drop-in 文件将按词典顺序应用"

drop-in文件按词典顺序生效

我们试试, 如果把刚刚的文件名从 customized.conf 改为 0.conf 重新加载, 再重启服务. 看看效果如何.

可以看到服务执行的命令行恢复到原本的 config.json, 而且能看到 .conf 文件的加载顺序.

改名成0.conf后覆盖失效,回到config.json


xray@.service 有什么作用

在查看 .service 文件时, 注意到除了 xray.service 还有一个 xray@.service . 这个是做什么用的呢? 

查看刚刚的那份资料, 里面有这么一段.

文档里解释xray@.service是模板

跑到 xray@.service.d 目录里面一看, 里面的 .conf 文件里面有个 %i

xray@.service.d里的%i是实例名变量

这是个啥意思呢? 

如果我们想跑一个xray的实例来测试客户端配置文件和服务端对接的时候, 我们把客户端的配置文件上传到 /usr/local/etc/xray/ 目录, 比如, xray-client.json

然后直接在命令行执行

service xray@xray-client start

然后我们来看看跑起来了一个什么东西

service xray@xray-client start跑客户端实例

所以整个逻辑是这样的, 我们执行 service xray@xray-client start 的时候, 应用的是 xray@.service 这个模板(template). 然后 xray-client 被认为是 实例(instance).

到了 .conf 文件里面 %i 就被替换为了实例名 xray-client , 所以就执行了现在这样的启动命令.

评论