ps:获取短命令名称和运行时间

ps:获取短命令名称和运行时间

我在 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很短的时间之后)。

相关内容