ps -e
大文字のプロセス名を小文字に変換します。マニュアルページやオンラインでこの動作の説明を見つけることができず、それを理解するためにソースコードを読むのに苦手です。
私は通常ps -ef
(フルフォーマットリスト)を使用しているので、この動作に全く気づいていませんでしたが、DBAは気づきました。
-e
小文字はフローラインに対して予想される動作ですか?なぜ小文字でエンコードされたのかを説明できる人はいますか?
以下は同じプロセスの例です。ただし、および-e
then を使用する場合は次のとおりです-ef
。
server ~> ps -e | grep -Ei pmon
2187719 ? 00:00:02 ora_pmon_foobar
2188497 ? 00:00:02 ora_pmon_phuuba
2188928 ? 00:00:02 ora_pmon_kilgor
[printed as lowercase when instance name (end of line) should be uppercase ]
server ~> ps -ef | grep -Ei pmon
oracle 2187719 1 0 04:00 ? 00:00:02 ora_pmon_FOOBAR
oracle 2188497 1 0 04:00 ? 00:00:02 ora_pmon_PHUUBAR
oracle 2188928 1 0 04:01 ? 00:00:02 ora_pmon_KILGORE
[prints upper case, which is good]
-e
一人でも切れます。しかし、それがまさに私たちが得るものです-f
。主-e
に小文字のプロセスについて疑問に思う。
答え1
ps
-f
列に他の情報を提供または提供しませんCMD
。
Linuxでは、
- -fなし、これはプロセス名。プロセス属性、長さは15バイトに制限されています。このプロパティは、コマンドの実行に使用されるシステムコールによって
execve()
実行されているファイルのデフォルト名に設定され、15バイトに切り捨てられ、プロセスでも使用できますprctl(PR_SET_NAME)
。返されたのと同じ結果ですps -o comm
。/proc/pid/stat
社内(...)
または現場でName:
見ることができます/proc/pid/status
。 - -fを使う、これはパラメータリスト空白文字で連結します。これは、コマンド(またはその祖先)を実行したプロセスのシステム
argv[0]
コールに2番目の引数として渡される引数(含む)です。execve()
引数のリストはNULで区切られて表示できます/proc/pid/cmdline
。返されたのと同じ結果ですps -o args
。以前は4096バイトに切り捨てられていましたが、最新バージョンのLinuxではこれ以上そうではありません(ps
オプションが提供されていない場合は、出力用にそれ自体が切り捨てられます-w
)。プロセスは、情報が見つかったスタック部分に新しいテキストを作成してそれを変更できます(制限あり)。
/proc/pid/exe
また、プロセスは現在実行中の実行可能ファイル(報告されているようにps -o exe
)へのシンボリックリンクになります。これは異なる場合があります。
それにもかかわらず、印刷できない文字をエスケープする以外は、ps
これらの文字に対する変換は行われません。
以下を実行できます。
ps -wwo comm,args,exe -p 2187719
IDが2187719のプロセスのプロセス名、パラメータリスト、および実行可能ファイルを表示するには、次の情報を使用してps
この情報を取得したソースソースを確認できます。
cat /proc/2187719/stat
sed -n l /proc/2187719/cmdline
readlink /proc/2187719/exe
例:
$ cp /usr/bin/sleep 'A longer sleep command for demonstration'
$ (exec -a 'SLEEP though could be anything' './A longer sleep command for demonstration' Infinity) &
[1] 6723
$ ps -fp "$!"
UID PID PPID C STIME TTY TIME CMD
chazelas 6723 6668 0 06:17 pts/2 00:00:00 SLEEP though could be anything Infinity
$ ps -p "$!"
PID TTY TIME CMD
6723 pts/2 00:00:00 A longer sleep
$ cat "/proc/$!/stat"
6723 (A longer sleep ) S 6668 6723 6668 34818 6726 4194304 154 0 0 0 0 0 0 0 25 5 1 0 17863 19312640 448 18446744073709551615 94858855174144 94858855192393 140731919224688 0 0 0 0 0 0 1 0 0 17 0 0 0 0 0 0 94858855206160 94858855207424 94858855886848 140731919232547 140731919232587 140731919232587 140731919237069 0
$ sed -n /Name/l "/proc/$!/status"
Name:\tA longer sleep $
$ sed -n l "/proc/$!/cmdline"
SLEEP though could be anything\000Infinity\000$
$ perl -e '$0 = "whatever you want"; sleep 20' &
[1] 13861
$ ps -wo comm,args,exe -p "$!"
COMMAND COMMAND EXE
whatever you wa whatever you want /usr/bin/perl
あなたの状況が異なる場合は、次の理由が考えられます。
- これらのプロセスが行われました
execve("/path/to/ora_pmon_foobar", ["ora_pmon_FOOBAR", NULL], envlist);
- 彼らはそうしましたが
execve("/path/to/anything", ["ora_pmon_FOOBAR", NULL], envlist)
(anything
おそらくそうだったでしょうora_pmon_FOOBAR
)、それからそれを作りましたprctl(PR_SET_NAME, "ora_pmon_foobar")
。 - 彼らはそうしましたが、
execve("/path/to/ora_pmon_foobar", ["ora_pmon_foobar", NULL], envlist);
その後argv[0]
はora_pmon_FOOBAR
。
または上記の組み合わせです。たとえば、上記の例に示すようににperl
割り当てると、$0
プロセス名と引数のリストの両方が変更されます。
execve()
2番目の引数として空のリストを持つプロセス(結果== 0)、その引数リストが空の場合、またはその引数リストが空でない場合は1。あるいは、その引数のリストは、カーネル操作で呼び出されたことのargc
ないプロセスによって呼び出されます。execve()
。この場合、ps -f
プロセス/タスク名は角かっこ内に表示されます。