背景
我想更改 Pure-FTPD 的一些选项。由于它没有配置文件,我需要添加命令行参数。我的系统是 Debian Stretch,它使用 systemd。
我尝试过的
/etc/systemd/*
或 中都没有 pure-ftpd.service 文件/usr/lib/systemd/*
。我跑了updatedb
然后locate pure-ftpd
没有结果。运行systemctl status pure-ftpd
(或其他命令,例如重新启动)工作正常。
最后我找到了一种进行编辑的方法:systemctl edit pure-ftpd
。正如建议的这个网站上的另一个答案,我打字[Service] \n ExecStart=/usr/sbin/pure-ftpd -my options
并点击:wq
。 Systemd 重新加载服务,一切正常。
运行systemctl status pure-ftpd
,它告诉我:
pure-ftpd.service:服务有多个 ExecStart= 设置,仅适用于 Type=oneshot 服务。拒绝。
我不知道什么是一次性服务。文档没有说明何时使用哪个,只是“预计该进程必须在 systemd 启动后续单元之前退出”。我不希望 systemd 在启动其他“单元”(其他服务?)之前等待 pure-ftpd 退出,所以这不是一个选择。
在两者中查找pure
( )并仅给出我自己生成的结果:。似乎没有服务文件,但它抱怨双重定义的 ExecStart 选项。grep -r pure
/etc/systemd
/usr/lib/systemd
/etc/systemd/system/pure-ftpd.service.d/override.conf
直接打电话/etc/init.d/pure-ftpd
也不行。跟踪该 shell 脚本,我发现 systemd 与此脚本挂钩并劫持了它。
我也跑了strace systemd restart pure-ftpd
。滚动浏览,这引起了我的注意:
socket(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0) = 3
connect(3, {sa_family=AF_UNIX, sun_path="/run/systemd/private"}, 22) = 0
sendmsg(3, {msg_name=NULL, msg_namelen=0, msg_iov=[{iov_base="\0AUTH EXTERNAL ", iov_len=15}, {iov_base="30", iov_len=2}, {iov_base="\r\nNEGOTIATE_UNIX_FD\r\nBEGIN\r\n", iov_len=28}], msg_iovlen=3, msg_controllen=0, msg_flags=0}, MSG_DONTWAIT|MSG_NOSIGNAL) = 45
sendmsg(3, {msg_name=NULL, msg_namelen=0, msg_iov=[{iov_base="l\1\4\1$\0\0\0\1\0\0\0\240\0\0\0\1\1o\0\31\0\0\0/org/fre"..., iov_len=176}, {iov_base="\21\0\0\0pure-ftpd.service\0\0\0\7\0\0\0repl"..., iov_len=36}], msg_iovlen=2, msg_controllen=0, msg_flags=0}, MSG_DONTWAIT|MSG_NOSIGNAL) = 212
---------------------->---------------------->---------------------->---------------------->---------------------->--------------------------^^^
"\21\0\0\0pure-ftpd.service\0\0\0\7\0\0\0repl"...
所以它通过 unix 套接字发送一些信息。显然,systemd 明白它所说的是什么。在我看来,好像有一个模板服务文件,如果真实的服务文件不存在,则默认使用该模板服务文件。
将 strace 附加到(毫不奇怪:PID 1 / init)的所有者/run/systemd/private
,我看到身份验证和 freedesktop 消息传入,之后它立即回复一条有关服务未正确加载的错误消息。它从不检查任何文件是否存在,也不读取任何文件。
解决方法
- 我可以
systemctl disable pure-ftpd
编辑该init.d
文件,这样它就不会挂接到 systemd 中。但这只是一个丑陋的黑客行为。应该有更好的办法。 - 输入所有这些后,我发现另一个答案描述你可以——毕竟! -- 通过配置文件并启动
pure-ftpd-wrapper
(这是 init.d 脚本中的默认设置,但谁知道 systemd 是否使用它)。但是,现在我想知道实际问题的答案:
问题
如何提供额外的命令行选项?
答案1
您是否知道 systemd 附带了一些生成器,可以为您生成 pure-ftpd.service 文件?结果是一个不太好的单元文件,但可以工作。
生成的文件夹是 /run/systemd/generator.late 您可以使用 cat pure-ftpd.service 查看源代码
然后,创建一个新的 /lib/systemd/system/pure-ftpd.service 并将 /run/ 单元的内容放入其中(然后您将能够调整该单元的代码)。
考虑到 debian 不再使用 init.d(当使用 systemd 时),并且所有非服务服务都是由生成器自动生成的。
更多信息:
https://www.freedesktop.org/software/systemd/man/systemd.generator.html https://www.freedesktop.org/software/systemd/man/systemd-sysv-generator.html
systemd-sysv-generator 是一个生成器,它在启动时和重新加载系统管理器配置时为 /etc/init.d/* 中的 SysV init 脚本创建包装器 .service 单元。这将允许 systemd(1) 像本机单元一样支持它们。