我在 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
答案1
尽管有列名,但您正在寻找的输出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
很短的时间之后)。