pure-ftpdのサービスファイルがありません。

pure-ftpdのサービスファイルがありません。

背景

Pure-FTPDのいくつかのオプションを変更したいです。構成ファイルがないため、コマンドラインパラメーターを追加する必要があります。私のシステムはsystemdを使用するDebian Stretchです。


私が試したこと

/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が終了するのを待つことを望まないので、これはオプションではありません。

両方でFind()をpure使用すると、私が直接作成した結果のみが提供されます。サービスファイルはないようですが、ExecStartオプションが二重に定義されていると文句を言います。grep -r pure/etc/systemd/usr/lib/systemd/etc/systemd/system/pure-ftpd.service.d/override.conf

直接通話はできません/etc/init.d/pure-ftpd。シェルスクリプトを追跡してみると、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はそれが何を言っているのかを知っています。実際のサービスファイルが存在しない場合、デフォルトで使用されるテンプレートサービスファイルがあるようです。

(当然ではありません:PID 1 / init)の所有者にstraceを接続すると、/run/systemd/private認証メッセージとfreedesktopメッセージの受信を見た直後にサービスが正しくロードされないというエラーメッセージが表示されます。ファイルが存在することを確認せず、ファイルを読み取ることもありません。


解決策

  • systemdに接続しないようにファイルをsystemctl disable pure-ftpd編集できます。init.dしかし、これは醜いハッキングだけです。より良い方法が必要です。
  • これをすべて入力して見つけました。もう一つの答えあなたができることを説明してください - 結局! - 設定ファイルと起動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)はそれを基本ユニットのようにサポートできます。

おすすめ記事