pure-ftpd 缺少服務文件
背景
我想更改 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 服務。拒絕。
我不知道oneshot服務是什麼。該文件沒有說明何時使用哪個,只是“預計該程序必須在 systemd 啟動後續單元之前退出”。我不希望 systemd 在啟動其他“單元”(其他服務?)之前等待 pure-ftpd 退出,所以這不是一個選項。
Grepping for
pure
(grep -r pure
)/etc/systemd
並/usr/lib/systemd
僅給出我自己製作的結果:/etc/systemd/system/pure-ftpd.service.d/override.conf
. 似乎沒有服務文件,但它抱怨雙重定義的 ExecStart 選項。直接呼叫
/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 是否使用它)。但是,現在我想知道實際問題的答案:問題
如何提供額外的命令行選項?
您是否知道 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 初始化腳本創建包裝器 .service 單元。這將允許 systemd(1) 像原生單元一樣支持它們。