上記のようにセロリをサービスとして実行しようとしています。ドキュメントから。
このマニュアルでは、%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:
まったく理解できないようです%I
。systemd
それを使用すると、私たちが見るものは%I
セレリーにのみ当てはまります。 (望むよりセロリ文書)。 so は while によって管理され%i
、無視され、透明に渡され、次に Celery によって管理されます。systemd
%I
systemd
これは多くのことを説明しますが、いくつかの質問を残します。
- なぜここで
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