Bash

將 cputime 的輸出格式化為 ps

  • January 1, 2017

我正在嘗試編寫一個腳本,該腳本可以在一段時間內監視程序的 CPU 使用率(以創建圖表)。

到目前為止,這是我正在使用的命令

ps -p $PROCID -o cputime,etimes

我唯一擔心的是 cputime 的輸出似乎是[dd]hh:mm(或類似的東西,現在不記得了)

有沒有辦法以秒為單位格式化 cputime,有點像 etime -> etimes 以秒為單位獲得經過的時間?

編輯:這是我目前收到的輸出

2-03:01:33 2653793

我希望第一個參數以秒為單位,而不是天-小時:分鐘:秒。

這會將第一次轉換為秒:

ps -p $PROCID -o cputime,etimes | awk -F'[: ]+' '/:/ {t=$3+60*($2+60*$1); print t,$NF}'

例如, ps 命令產生:

$ ps -p 5403 -o cputime,etimes
   TIME ELAPSED
01:33:38 1128931

awk命令處理並返回:

ps -p 5403 -o cputime,etimes | awk -F'[: ]+' '/:/ {t=$3+60*($2+60*$1); print t,$NF}'
5618 1128931

解釋

  • -F'[: ]+'

這告訴 awk 將冒號和空格都視為欄位分隔符。這樣,小時、分鐘和秒將顯示為單獨的欄位。

  • /:/ {t=$3+60*($2+60*$1); print t,$NF}

初始/:/限制程式碼只能在包含冒號的行上工作。這將刪除標題行。秒數是通過小時、分鐘、秒計算的t=$3+60*($2+60*$1)。然後將結果值t與經過的時間一起列印。

處理天數

如果ps產生天、小時、分鐘、秒,如:

2-03:01:33

然後,改用此程式碼:

ps -p $PROCID -o cputime,etimes | awk -F'[-: ]+' '/:/ {t=$4+60*($3+60*($2+24*$1)); print t,$NF}'

如果幾天可能會或可能不會在輸出前添加,則使用此組合命令:

ps -p $PROCID -o cputime,etimes | awk -F'[-: ]+' '/:/ && NF==5 { t=$4+60*($3+60*($2+24*$1)); print t,$NF} /:/ && NF==4 {t=$3+60*($2+60*$1); print t,$NF}'

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