我在 Debian 8 系统上试图确定某个用户的进程及其各自的运行时:
$ 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
在第一个输出中使用短进程名称,而不是第二个输出的长名称。我找不到任何方法,阅读ps
手册页。
如何获得输出 #1 的 CMD 以及输出 #2 的经过时间?
解决方案 @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
:cmd
是一个非标准别名,args
并显示该命令及其所有参数,包括进程所做的任何修改。comm
是进程名称,默认情况下在 Linux 上是进程执行的最后一个文件的基本名称的前 15 个字节(或者如果它没有执行任何文件,则与其父进程的名称相同,或者内核的任务名称任务),并且可以使用PR_SET_NAME
prctl()
.请注意,这
etime
是自进程产生以来的时间量,并且一个进程可以(并且经常会)在其生命周期内运行多个命令,因此如果您看到cmd 00:03
,这并不一定意味着cmd
已经运行了 3 秒,当前正在运行的进程cmd
很可能之前已经运行了一些其他命令。正在运行的进程
ps
之前正在运行sh
,在此期间它大部分时间都在等待另一个进程运行sleep
(在运行sh
了很短的时间之后)。