web-dev-qa-db-ja.com

ps:短いコマンド名と経過時間を取得します

私は特定のユーザーのプロセスとそれぞれのランタイムを決定しようとしているDebian8システムを使用しています。

$ ps -u <user>
  PID TTY          TIME CMD
26038 ?        00:00:00 php5-fpm
26052 ?        00:00:00 php5-fpm
26950 ?        00:00:00 php5-fpm
27344 ?        00:00:00 php5-fpm
28292 ?        00:00:00 php5-fpm
28691 ?        01:54:21 python3 /usr/lo
$ which ps  # ps is not aliased or so.
/bin/ps

今私はさらにそれぞれのプロセスの経過時間を求めています。だから私は試しました:

$ ps -o cmd=,etime= -u <user>
php-fpm: pool <user>         00:36
php-fpm: pool <user>         00:36
php-fpm: pool <user>         00:24
php-fpm: pool <user>         00:18
php-fpm: pool <user>         00:04
python3 /usr/local/bin/fixw    17:39:44

ただし、短いプロセス名を使用したいphp-fpm最初の出力と同じように、2番目の出力の長い名前ではありません。 psのマニュアルページを読んで、そうする方法を見つけることができませんでした。
出力#2の経過時間とともに出力#1のCMDを取得するにはどうすればよいですか?

ソリューション @StephenKittの答えは、足りないヒントでした。ただし、少し変更する必要がありました。奇妙な出力:

$ ps -o comm=,etime= -u <user>
,etime=
php5-fpm
php5-fpm
php5-fpm
php5-fpm
php5-fpm
ps
python3 /usr/lo

別々のオプションが機能します:

$ ps -o comm= -o etime= -u <user>
php5-fpm              00:55
php5-fpm              00:27
php5-fpm              00:24
php5-fpm              00:13
php5-fpm              00:08
python3 /usr/lo    17:49:38
2
Richard Neumann

列名にもかかわらず、探している出力はcommではなくcmdです。

_ps -o comm= -o etime= -u <user>
_

cmdargsの非標準エイリアスであり、プロセスが行った変更を含む、すべての引数を含むコマンドを示します。

commプロセス名です。Linuxでは、デフォルトでは、プロセスが最後に実行したファイルのベース名の最初の15バイトです(または、親プロセスの場合は親プロセスと同じ名前です)。ファイルまたはカーネルタスクのタスク名を実行しなかったため、_PR_SET_NAME_ prctl()で変更できます。

etimeは、プロセスが生成されてからの時間であり、プロセスは存続期間中に複数のコマンドを実行できます(多くの場合、実行します)。したがって、_cmd 00:03_と表示された場合、必ずしもcmdが3秒間実行されていることを意味します。現在、cmdを実行しているプロセスは、以前に他のコマンドを実行した可能性があります。

_$ sh -c 'sleep 3; exec ps -o comm= -o etime='
zsh                   13:48
ps                    00:03
_

psを実行しているプロセスは以前はshを実行していましたが、その間、ほとんどの時間をsleepを実行している別のプロセスを待機していました(shを非常に実行した後)短時間)。

2
Stephen Kitt