web-dev-qa-db-ja.com

psのCOMMAND列で「init [2]」はどういう意味ですか?

読む プロセスを囲む括弧はどういう意味ですか? 実行可能ファイル名が出力されることを理解しています。

Linux ps マニュアルページ:

プロセス引数が使用できない場合があります。これが発生すると、psは代わりに実行可能ファイル名を角かっこで囲んで出力します。

ただし、ps -Awwo pid,comm,argsを使用すると、次のようになります。

  PID COMMAND         COMMAND
    1 init            init [2]

これは何を意味するのでしょうか? 「実行可能ファイル名」はinitまたは[2]であると想定されていますか?

もちろん、実行可能ファイルはinit-[2]とは何ですか?なぜ印刷されるのですか?

(また、実行可能ファイルの名前を知っていると、フルパスを表示できない理由がわかりません。)

5
n611x007

comm列とargs出力のps列の最初のワードの両方に、関係者全員がデフォルトの規則に従っている場合、実行可能プログラムの名前が表示されます。ただし、さまざまな理由で不一致が生じる可能性があります。

プログラムが起動すると、args列に示されているコマンド名が、プログラムを実行する親プログラムによって選択され、引数(argv[0])として渡されます。慣例により、親は実行可能ファイルのベース名(つまり、ディレクトリ部分のない実行可能ファイルへのパス)を選択しますが、これは強制されません。プログラムが実行されると、その文字列を上書きできます。

Init(少なくとも従来のLinux SysVinit)は、そのargv[0]を上書きして、現在の ランレベル を示します。

Linuxでは、comm列は、カーネルによって、実行可能ファイルのベース名の最初の16文字に最初に入力されます。プロセスは、 prctl システムコールでコンテンツを変更できます。

実行可能ファイルの名前が変更または削除された場合、comm列もargs列もこれを反映しません。

psは、実行可能ファイルへのパスを表示しません。これは、ジョブの説明に含まれていません。 lsoflsof -a -p 1 -d txtで教えてくれます。

Linuxでは、この情報は/proc/PID/のファイルで確認できます。

  • /proc/1/stat(括弧内の2番目のフィールド)および/proc/1/statuscommフィールド)内のプロセス名(Nameフィールド)。
  • /proc/1/exeを介した実行可能ファイルへのパス。
  • argv[0]の引数(/proc/1/cmdlineで始まる)(引数はnullバイトで区切られます)。