修改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 文件. 也看到了实际运行的命令.

知道了是 /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 这个配置文件.

重启 service

service xray restart

提醒要重新加载一下.

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

systemctl daemon-reload

再重启 service.


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


寻找原因

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


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

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

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

看来如果要自定义 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 的高质量翻译.


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

那么, 我应该先把 /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 , 修改启动命令

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

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


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


========


========

后记

.conf 文件的加载顺序

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

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

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


xray@.service 有什么作用

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

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


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

这是个啥意思呢? 

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

然后直接在命令行执行

service xray@xray-client start

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


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

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

评论

The Hot3 in Last 30 Days