修改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 状态. 都没有修改生效.
寻找原因
然后... 就不小心地有了新发现.
运行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 文件将按词典顺序应用"
可以看到服务执行的命令行恢复到原本的 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 , 所以就执行了现在这样的启动命令.
评论
发表评论