Linux
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
儘管有列名,但您要查找的輸出是
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
了很短的時間之後)。