私は特定のユーザーのプロセスとそれぞれのランタイムを決定しようとしている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
列名にもかかわらず、探している出力はcomm
ではなくcmd
です。
_ps -o comm= -o etime= -u <user>
_
cmd
はargs
の非標準エイリアスであり、プロセスが行った変更を含む、すべての引数を含むコマンドを示します。
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
を非常に実行した後)短時間)。