Systemd

pure-ftpd 缺少服務文件

  • March 1, 2019

背景

我想更改 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) 像原生單元一樣支持它們。

引用自:https://unix.stackexchange.com/questions/371734