指定子の解決:%iと%Iの違いは何ですか?

指定子の解決:%iと%Iの違いは何ですか?

上記のようにセロリをサービスとして実行しようとしています。ドキュメントから

このマニュアルでは、%n%Iログファイルに指定子を使用しています。

セロリ提供:

ExecStart= [...] --logfile=${CELERYD_LOG_FILE}

celery.service.d/celery.conf

Environment="CELERYD_LOG_FILE=/var/log/celery/%n%I.log"

%nこれを行うと、起動時に解決されたサービス状態で%Iがまだこの段階にあることがわかります。

systemctl status celery.service
[...]
    --logfile=/var/log/celery/worker%I.log

次のログファイルを取得します。

/var/log/celery/worker.log
/var/log/celery/worker-1.log
/var/log/celery/worker-2.log

しかし、使用すると、%i最初にすべてが解決されます。

celery.service.d/celery.conf

Environment="CELERYD_LOG_FILE=/var/log/celery/%n%i.log"

次を生成します。

systemctl status celery.service
[...]
    --logfile=/var/log/celery/celery.service.log

ログファイルのみを取得します。

/var/log/celery/celery.service.log

これはとても混乱しています。

~からシステム文書、唯一の違いはエスケープする必要があります。

  • "%i" |instance name|インスタンス化されたユニットの場合: "@" 文字とユニット名のサフィックスの間のストリング。
  • '%i' |エスケープされていないインスタンス名'%i'と同じですが、エスケープはキャンセルされました。

ここで何か抜けましたか?

また、ファイルに直接ログパスを設定すると、フォームのみが.service許可%n%iされることを確認しました。

ExecStart= [...] --logfile=/var/log/celery/%n%i.log

そうし、結果は

/var/log/celery/celery.service.log

しかし、

ExecStart= [...] --logfile=/var/log/celery/%n%I.log

トリガーエラー:

celery.service failed to run 'start' task: Operation not supported
Failed to start Celery worker.

どうですか?

私はそれを使用していますシステム 215-17Debian の提示で。

編集1:

まったく理解できないようです%Isystemdそれを使用すると、私たちが見るものは%Iセレリーにのみ当てはまります。 (望むよりセロリ文書)。 so は while によって管理され%i、無視され、透明に渡され、次に Celery によって管理されます。systemd%Isystemd

これは多くのことを説明しますが、いくつかの質問を残します。

  • なぜここでsystemd理解できないのです%Iか?
  • 代わりにCelery aを渡すにはどうすればよいですか%i
  • .serviceファイルではなくファイルに直接オプションを渡すと、なぜ.conf違いが発生しますか?

変更ログを見ましたが、私が使用しているバージョンより新しいsystemdものが見つかりませんでした。%I

編集2:

次を実行すると、次のエラーメッセージが表示されますsystemctl status celery.service

[/etc/systemd/system/celery.service.d/celery.conf:18] Failed to resolve specifiers, ignoring: "CELERYD_LOG_FILE=/var/log/celery/%n%I.log"

しかし、再現することはできません。なぜ毎回発生しないのか、一度だけ発生するのかわかりません。

ベストアンサー1

~から文書%i%Iとの違いは、渡されたパラメータの「エスケープ」とすでに言及されています。

次の質問は「脱出」とはどういう意味ですか?

Escape は特殊文字を変更することを意味します。%i特殊文字を/ダッシュ​​に置き換えます-\x20

警告:インスタンス名にダッシュが含まれている場合、変数は-ダッシュを置き換えます%I。これがドキュメントに「Escape is undo」と記載されている理由です。

はい

[email protected]次の内容を考えてみましょう。

[Service]
Environment="OPTIONS=%I %i"
ExecStart=/usr/bin/bash -c "echo $OPTIONS >> /tmp/test-specifier"

その後、サービスを開始します。systemctl start some-service@/etc/path/to/some-conf 出力は/tmp/test-specifier次のとおりです。

/etc/path/to/some/conf -etc-path-to-some-conf

変数some-confがに変更されました。some/conf%I

結論として

したがって、インスタンス名の動作は次/etc/path/to/some-confのようになります。

  • %iエスケープされた指定子:-etc-path-to-some-conf
  • %Iエスケープされていない指定子:/etc/path/to/some/conf

テスト設定

CentOS 7 には以下が含まれます。systemd-219-67

systemd-escapeコマンドラインからエスケープされたsystemdの文字列を試すことができます。

引用する

https://www.freedesktop.org/software/systemd/man/systemd.unit.html#Specifiers http://0pointer.de/blog/projects/instances.html https://www.freedesktop.org/software/systemd/man/systemd-escape.html

おすすめ記事