彼らはしません。

彼らはしません。

psの次の2つのコマンドが異なるCMDフィールドを提供するのはなぜですか?これはscreen異なるため重要ですSCREEN。 1つ目はクライアント、2つ目はサーバーです。ありがとうございます。

$ ps -A | grep -i screen
 3341 ?        00:00:00 screen
 3875 ?        00:00:00 screen
27525 ?        00:00:00 screen
$ ps -Af | grep -i screen
testme    3341     1  0  2018 ?        00:00:00 SCREEN -S testme
testme    3875     1  0  2018 ?        00:00:00 SCREEN -S tm
t        27525     1  0  2018 ?        00:00:00 SCREEN -S test

SCREENプログラムではないのになぜ現れるのでしょうかps

$ SCREEN
SCREEN: command not found

答え1

screenSCREENその後、クライアントと区別するためにデフォルト(サーバー)プロセスの名前を変更します。

これはマニュアルページで非常に間接的に言及されたことがあります:

このコマンドは、デフォルトの「SCREEN」プロセスの正しいデバッグ出力にのみ影響します。アフェンダプロセスのデバッグ出力は一度だけ永久にオフにできます。

しかし、奇妙なことに、私が見ることができる場所には明示的に言及されていません。

psまた、ps -f実行可能ファイル名(ps「command」書式指定子)や再構成されたコマンドライン(ps -f「args」書式指定子)など、CMDのさまざまなコンテンツを表示します。後者はプロセスのARGVを使用して変更されることを確認しますが、実行可能ファイル名自体は変更されません。

答え2

彼らはしません。

厳密に言えば問題だなぜ彼らがしたことについて答えはありません。それは嘘を前提としたものです。

cmdここには、ucmd列、2つが表示されます。その他情報の断片。残念ながら、GNUpsプログラムとFreeBSDpsプログラムの両方が状況を非常に混乱させます。

/procLinuxやBSDカーネルなどのカーネルは、ファイル内のプロセスに関する4つの関連情報を提供しますsysctl()

  • プロセス会計に使用される略語としても知られるプログラムイメージの略語です。
  • 対応するパラメータ文字列はexecve()ランタイムによって初期化され、変更できます。
  • execve()ランタイムによって初期化され変更可能な環境文字列です。
  • 実行可能プログラム・イメージ・ファイルの絶対パス名。

パラメータ文字列と環境文字列は、前述のように実行時に変更できます。https://unix.stackexchange.com/a/438007/5132そしてhttps://unix.stackexchange.com/a/432681/5132。 Linuxでは、プロセスアカウント名を変更することもできます。

GNU Screenは最初の引数文字列が「SCREEN」になるように引数文字列を変更しましたが、プロセスアカウント名はまだ「screen」ではありません。

これら4つの情報を表示するには、2つの列のみが使用されますps。 FreeBSDでは、列にはps次の情報が含まれています。

  • commandargsパラメータ文字列、環境文字列(eこのオプションを使用する場合)、および角かっこで囲まれたアカウント名(このオプションが使用され、最後のパラメータ文字列と一致しない場合)という名前の列d。列が1つある場合は、すべての列の前にツリーマップが付けられます。
  • 名前が付けられ、プロセスアカウント名が含まれますucommcomm

GNU はps前者にエイリアスを追加し、後者にエイリアスを追加します。ツリーマップと環境文字列cmducmd両方列を作成し、常にデンドログラムをその列に入れます。いいえ最後の列。

GNUの場合ps、質問のオプション-f(オプションと混同しないでください)は、f印刷する-Afさまざまな列セットを指定するための短縮です。psデフォルトの列セットには包含セットが含まれますucmd-fこのオプションを使用すると、セットオーバーライドが使用されますcmd

BSD マニュアルではps、 と略語で選択できる正確な列を提供してこれを明確に説明します。 GNUのマニュアルでは、「フルフォーマット」、「ジョブフォーマット」、「ロングフォーマット」、および「ユーザーフォーマット」に言及していますが、各フォーマットがどの列セットであるかを明示的にリストしていません。-j-l-u-vps

状況をさらに混乱させるために、GNUpsまたはFreeBSDpsの両方が出力で提供される列ヘッダーのコマンドラインで使用されている列名を使用しません。そのため、列見出しだけでは実際にどの列が表示されるかわからない場合が多いです。

  • FreeBSDはpsアカウント名列をまたはとしてマークし、UCOMMパラメータCOMMAND文字列列も表示しますCOMMAND
  • GNUはpsパラメータ文字列列をORとしてマークCMDし、COMMAND会計名列もCMDORとしてマークしますCOMMAND

s6-ps(比較のために、Laurent Bercotの唯一のcomm固定argsおよび固有のenvヘッダラベルである、、、およびCOMMはカーネルの4つの情報のうち最初の3つを組み合わせることなく直接提供します。)COMMANDENVIRONMENT

  • ローランベルコート(2014)。s6-pss6-Linux - ユーティリティ。ソフトウェア。

答え3

ps -Aデフォルトの形式を使用して、pid、端末、累積CPU時間、および実行可能ファイル名(ucmd)を表示します。実行可能ファイル名は変更できず、使用された実行可能ファイル名を正確に反映します。

ps -Af他のフィールドに加えて、引数(comm、または)でコマンド全体を表示するフルフォーマットを使用しますargs。完全なコマンドは、次の説明に従って変更できます。マイケル・ホーマー~の回答screenプロセスがクライアントかサーバーかを表示するように変更します。

screenプロセスを見つけてその目的を決定するには、次のようにします。

ps -fC screen

これには、実行可能ファイル名が一致するプロセスの完全な詳細が表示されますscreen

関連情報