Linux

ps:獲取簡短的命令名稱和經過的時間

  • June 19, 2018

我在 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

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了很短的時間之後)。

引用自:https://unix.stackexchange.com/questions/450575