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
screen
SCREEN
その後、クライアントと区別するためにデフォルト(サーバー)プロセスの名前を変更します。
これはマニュアルページで非常に間接的に言及されたことがあります:
このコマンドは、デフォルトの「SCREEN」プロセスの正しいデバッグ出力にのみ影響します。アフェンダプロセスのデバッグ出力は一度だけ永久にオフにできます。
しかし、奇妙なことに、私が見ることができる場所には明示的に言及されていません。
ps
また、ps -f
実行可能ファイル名(ps
「command」書式指定子)や再構成されたコマンドライン(ps -f
「args」書式指定子)など、CMDのさまざまなコンテンツを表示します。後者はプロセスのARGVを使用して変更されることを確認しますが、実行可能ファイル名自体は変更されません。
答え2
彼らはしません。
厳密に言えば問題だなぜ彼らがしたことについて答えはありません。それは嘘を前提としたものです。
cmd
ここには、ucmd
列、2つが表示されます。その他情報の断片。残念ながら、GNUps
プログラムとFreeBSDps
プログラムの両方が状況を非常に混乱させます。
/proc
Linuxや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
次の情報が含まれています。
command
args
パラメータ文字列、環境文字列(e
このオプションを使用する場合)、および角かっこで囲まれたアカウント名(このオプションが使用され、最後のパラメータ文字列と一致しない場合)という名前の列d
。列が1つある場合は、すべての列の前にツリーマップが付けられます。- 名前が付けられ、プロセスアカウント名が含まれます
ucomm
。comm
GNU はps
前者にエイリアスを追加し、後者にエイリアスを追加します。ツリーマップと環境文字列cmd
ucmd
両方列を作成し、常にデンドログラムをその列に入れます。いいえ最後の列。
GNUの場合ps
、質問のオプション-f
(オプションと混同しないでください)は、f
印刷する-Af
さまざまな列セットを指定するための短縮です。ps
デフォルトの列セットには包含セットが含まれますucmd
。-f
このオプションを使用すると、セットオーバーライドが使用されますcmd
。
BSD マニュアルではps
、 と略語で選択できる正確な列を提供してこれを明確に説明します。 GNUのマニュアルでは、「フルフォーマット」、「ジョブフォーマット」、「ロングフォーマット」、および「ユーザーフォーマット」に言及していますが、各フォーマットがどの列セットであるかを明示的にリストしていません。-j
-l
-u
-v
ps
状況をさらに混乱させるために、GNUps
またはFreeBSDps
の両方が出力で提供される列ヘッダーのコマンドラインで使用されている列名を使用しません。そのため、列見出しだけでは実際にどの列が表示されるかわからない場合が多いです。
- FreeBSDは
ps
アカウント名列をまたはとしてマークし、UCOMM
パラメータCOMMAND
文字列列も表示しますCOMMAND
。 - GNUは
ps
パラメータ文字列列をORとしてマークCMD
し、COMMAND
会計名列もCMD
ORとしてマークしますCOMMAND
。
s6-ps
(比較のために、Laurent Bercotの唯一のcomm
固定args
および固有のenv
ヘッダラベルである、、、およびCOMM
はカーネルの4つの情報のうち最初の3つを組み合わせることなく直接提供します。)COMMAND
ENVIRONMENT
- ローランベルコート(2014)。
s6-ps
。s6-Linux - ユーティリティ。ソフトウェア。
答え3
ps -A
デフォルトの形式を使用して、pid、端末、累積CPU時間、および実行可能ファイル名(ucmd
)を表示します。実行可能ファイル名は変更できず、使用された実行可能ファイル名を正確に反映します。
ps -Af
他のフィールドに加えて、引数(comm
、または)でコマンド全体を表示するフルフォーマットを使用しますargs
。完全なコマンドは、次の説明に従って変更できます。マイケル・ホーマー~の回答、screen
プロセスがクライアントかサーバーかを表示するように変更します。
screen
プロセスを見つけてその目的を決定するには、次のようにします。
ps -fC screen
これには、実行可能ファイル名が一致するプロセスの完全な詳細が表示されますscreen
。