システム出口コードEXIT_FDSとはどういう意味ですか?

システム出口コードEXIT_FDSとはどういう意味ですか?

systemd statusサービスを停止した後、次のメッセージを受け取りました。

Actice: failed (Result: exit-code) <...> Main PID: 4747 (code=exited, status=202/FDS)

状態FDSは次のように定義される。文書このように:

202 EXIT_FDS不要なファイル記述子を閉じたり、渡されたファイル記述子を調整したりできません。

サービスの開始が正しく機能し、エラーは報告されません。systemd status

質問

  1. EXIT_FDSはより実用的に何を意味しますか?
  2. ステータスコードは私のアプリケーションから出ていますか、それともシステム自体から来ますか?
  3. 私のアプリケーションが停止したときに閉じないTCPソケットを開きます。これが理由ですか?
  4. それでは、systemdに遅延ソケットをエラーとして報告せずに無視させることはできますか?

詳細

フルステータスメッセージ:

tool-user@tool-box:~$ systemctl status tool.service
● tool.service - Tool application
   Loaded: loaded (/home/tool-user/tool.service; linked; vendor preset: enabled)
   Active: failed (Result: exit-code) since Mon 2022-02-07 14:14:46 CET; 3s ago
  Process: 4758 ExecStop=/bin/bash -c tool-stop && while ps -p $MAINPID >/dev/null
  Process: 4601 ExecStart=/bin/bash -c tool-start (code=exited, status=0/SUCCESS)
 Main PID: 4747 (code=exited, status=202/FDS)

Feb 07 14:14:31 tool-box systemd[1]: Starting Tool application...
Feb 07 14:14:32 tool-box bash[4601]: Server started on port 44680
Feb 07 14:14:32 tool-box systemd[1]: Started Tool application.
Feb 07 14:14:44 tool-box systemd[1]: Stopping Tool application...
Feb 07 14:14:45 tool-box systemd[1]: tool.service: Main process exited, code=exited, status=202/FDS
Feb 07 14:14:46 tool-box systemd[1]: tool.service: Failed with result 'exit-code'.
Feb 07 14:14:46 tool-box systemd[1]: Stopped Tool application.

サービス定義ファイルは次のとおりです。

[Unit]
Description=Tool application
# Standard dependencies for web server
After=network.target remote-fs.target nss-lookup.target httpd-init.service

[Service]
Type=forking
Restart=on-failure
RestartSec=10
ExecStart=/bin/bash -c 'toolStart'
ExecStop=/bin/bash -c 'toolStop && while ps -p $MAINPID >/dev/null 2>&1; do sleep 1; done'
User=tool-user
StandardOutput=syslog
StandardError=syslog
TimeoutStopSec=60

[Install]
WantedBy=multi-user.target

オペレーティングシステム:Windows 10のVirtualBoxで実行されているUbuntu 18.04 Server。

tool-user@tool-box:~$ uname -a
Linux tool-box 4.15.0-166-generic #174-Ubuntu SMP Wed Dec 8 19:07:44 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux

答え1

サービスのType=forkingPIDはExecStart4758で、お問い合わせの終了コードはデフォルトのPID 4747としてリストされているため、サブプロセスをsystemd管理してExecStartプロセスを正常に実行したと結論付けることができるため、システムテーブル - 特定の終了コードは次のとおりです。ここには適用されません。fork()execve()

systemdエラーがfork()次の後の実際のサブプロセスで発生した場合、以前はシステム固有の終了コード表が適用されます。特に、エラー202は、execve()サービス定義の実装StandardInput=またはディレクティブに問題があることを意味しますStandardOutput=StandardError=ただし、ExecStart特定のレポートは PID 4601 で終了するため、ここではstatus=0/SUCCESSそのようなことは発生しません。 PID 4758で実行されているので、ExecStopそのうちの1つは出ません。

ステータスコード202はアプリケーションの「メインプロセス」(PID 4747を持つプロセス)から来ており、その意味はアプリケーション開発者が意図したものとは何の関係もありません。

残りのTCPソケットは原因ではありません。アプリケーションプロセスが終了したため、カーネルは残っているソケットをすべてクリーンアップします。

もちろん、アプリケーションがSO_REUSEADDRソケットオプションを使用しない場合は、そうでない可能性があります。今再起動アプリケーションを実行し、遅延ソケットのTIME_WAITが期限切れになるまで同じポート番号を使用するようにします。ただし、これはシステムの問題ではなく、アプリケーションが独自に処理する必要がある問題です。

この/FDS部分は以下から来ています。exit_status_to_string()shared/exit-status.c関数はsystemdソースパッケージのファイルにあります。

ステータスコードに標準化された意味がある場合、関数はステータスコードの意味を説明する簡単なヒントを追加する必要があります。関数は、使用するステータスコードヒントセットを決定するためにパラメータを使用できますが、関数をいつ使用するかsystemctl status(ファイル内など)systemctl/systemctl-show.cEXIT_STATUS_LIBC | EXIT_STATUS_SYSTEMD、(この記事を書いている時点で)ステータスコードが実際にシステム化されたプロセスから来ているかどうかを確認せずに、「libcとsystemd自体の使用に基づいてステータスコードヒントを表示する」ように設定された引数を使用して呼び出すようです。母音。

最終結果は、状態202が/FDSあるかどうかにかかわらず、常に状態202に接続されることである。体系的な具体的な意味 「不要なファイル記述子を閉じることができないか、渡されたファイル記述子を調整できません」または。これは単なるテーブルルックアップです。もう知能があるとは思わないでください。

(Unixプログラミング文献およびプログラマの専門用語では、「fds」は「ファイル記述子」という用語の一般的な略語です。)また、systemdコード内のステータス/FDSコード202のシンボル名を意味します。になります。EXIT_FDSEXIT_

関連情報