ps -e プロセス名を小文字に変換

ps -e プロセス名を小文字に変換

ps -e大文字のプロセス名を小文字に変換します。マニュアルページやオンラインでこの動作の説明を見つけることができず、それを理解するためにソースコードを読むのに苦手です。

私は通常ps -ef(フルフォーマットリスト)を使用しているので、この動作に全く気づいていませんでしたが、DBAは気づきました。

-e小文字はフローラインに対して予想される動作ですか?なぜ小文字でエンコードされたのかを説明できる人はいますか?

以下は同じプロセスの例です。ただし、および-ethen を使用する場合は次のとおりです-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プロセス/タスク名は角かっこ内に表示されます。

関連情報