「ps -p proc1 proc2 proc3」は「-csh」、「-tcsh」、「-/bin/tcsh」を表示し、「ps -p proc[n]」は「tcsh」のみを表示するのはなぜですか。 ?

「ps -p proc1 proc2 proc3」は「-csh」、「-tcsh」、「-/bin/tcsh」を表示し、「ps -p proc[n]」は「tcsh」のみを表示するのはなぜですか。 ?

私は(cshではなく)tcshを使用し、pgrep csh | xargs ps -pなぜcshを実行しているのかを調べるために実行しました。いくつかの結果:

 1529 pts/0    Ss     0:00 -csh
 1764 pts/3    Ss     0:00 -tcsh
 1979 pts/4    Ss+    0:00 -bin/tcsh

それから私はps -p 1529 1764 1979同じ結果を得ました。

  PID TTY      STAT   TIME COMMAND
 1529 pts/0    Ss     0:00 -csh
 1764 pts/3    Ss     0:00 -tcsh
 1979 pts/4    Ss+    0:00 -bin/tcsh

それから私はそうでした。ps -p 1529; ps -p 1764; ps -p 1979

  PID TTY          TIME CMD
 1529 pts/0    00:00:00 tcsh
  PID TTY          TIME CMD
 1764 pts/3    00:00:00 tcsh
  PID TTY          TIME CMD
 1979 pts/4    00:00:00 tcsh

ps --version与えてprocps-ng version 3.3.10生産tcsh --versionしてくださいtcsh 6.19.00 (Astron) 2015-05-21 (x86_64-unknown-linux) options wide,nls,dl,al,kan,sm,rh,color,filec

なぜこんなに奇妙な行動をするのでしょうか?プロセスモニタを作成しようとしていますが、tcshに3つの異なる形式を取るのは面倒です。

答え1

2つの異なる分野を比較しています。

タイトル行に注意してください。 dashがあるものとCOMMANDtcshがあるものがありますCMD。より標準書式指定子部分man 1 psマンページ。

基本的に:

  • cmdCMD)はパラメータがすべて文字列のコマンドです。

  • commCOMMAND)は、プロセスが実行されている実行可能ファイルの名前です。

Linuxでは、後者を個々のスレッドprctl(PR_SET_NAME, string)だけでなくプロセス全体に設定することもできます。しかし、制限は16文字です。pthread_setname_np(thread, string)string

シェルは通常、プロセスリストが論理的に正しく表示されるように、実行時にシンボリックリンクまたはパターンに基づいて名前を設定します。特に、ダッシュで始まる名前(例-tcsh:)は、次のことを示すために使用されます。ログインシェル。

OPの例にはシェルバイナリを実行する3つのシェルがありtcsh、その3つすべては次のとおりです。ログインシェル、そのうちの1つがcshモードにあります。

ログインシェル特定の対話型モードのシェルです。シェルは、スクリプトを実行するシェルとは若干異なる動作をします。スクリプトには必要ありませんが、人がシェルを使いやすくするためのアドオンを含むモードだと思います。

OPはほぼ確実にcshエイリアスを使用し、3つのシェルはtcshそれぞれおよびで始まりました。コマンドで実行された実際のバイナリを見つけるには。tcsh -lcsh -lbin/tcsh -lrealpath $(which command)

答え2

これはLinuxコマンドにとって奇妙なことですpsps渡したオプションに基づいてバリアントを推測して、複数のUnixバリアントの動作をエミュレートしようとします。本ではこれを「性格」と表現する。マニュアルページ

推測されるバリエーションによって、デフォルトの出力フィールドセットが異なります。 Linux属性では、(「PID」)、(「TTY」)、(「TIME」)、および(「CMD」)列がps表示されます。 BSD属性で「PID」、「TTY」、time comm ps -p 1529 ps -p 1529 1764 1979 -p 1529 1764 1979 ps -p ps ps 1529`を表示します。pidttytimeargspspidttystat “STAT”,“TIME” and“COMMAND”.is (historically) System V syntax, and in that case Linux chooses the Linux personality.has theoption with the argument, and two more argumentsand(they're argument toitself, not to theoption). With a process ID as argument,chooses the BSD output format. You get the same with

args列(エイリアス、タイトル「CMD」)と列(タイトル「COMMAND」)commandの違いcommは、CMDはすべての引数がスペースで区切られた(切り捨てられる)コマンドラインを表示し、COMMANDは実行可能ファイル名のみを表示することです。 。通常、プログラムのコマンドラインの最初の引数(引数番号0)は通常、実行可能ファイルの名前です。ただし、シェルがログインシェルとして呼び出されると、パラメータ0の前にダッシュ(-)が付けられます。これにより、シェルはログインシェルとして機能する必要があることを検出します。このトピックについては、以下を参照してください。ログインシェルと非ログインシェルの違いは何ですか?そして`--login`オプションで呼び出されたログインシェルで$ 0に単一のハイフンが表示されないのはなぜですか?

現れcshと親戚はどこかにtcsh走ったという意味だcsh。 ifがcsh単に象徴的であるという事実に気づかなかったかもしれませんtcsh

関連情報