2012-12-11 78 views
1

我有一個任務會隨着時間消耗仲裁CPU和內存。它給了我一個輸出執行以下Linux命令:從矩陣中打印出值

mpstat -u 1 -P ALL

輸出看起來像:

02:22:14 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle 
02:22:15 PM all 4.51 0.00 0.11 0.00 0.00 0.00 0.00 0.00 95.37 
02:22:15 PM 0 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 99.00 
02:22:15 PM 1 **78.22** 0.00 0.99 0.00 0.00 0.00 0.00 0.00 20.79 

02:22:15 PM 2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 
02:22:15 PM 3 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 
02:22:15 PM 4 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 
02:22:15 PM 5 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 
02:22:15 PM 6 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 
02:22:15 PM 7 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 
02:22:15 PM 8 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 
02:22:15 PM 9 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 
02:22:15 PM 10 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 
02:22:15 PM 11 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 
02:22:15 PM 12 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 
02:22:15 PM 13 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 
02:22:15 PM 14 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 
02:22:15 PM 15 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 
02:22:15 PM 16 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 
02:22:15 PM 17 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 
02:22:15 PM 18 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 
02:22:15 PM 19 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 
02:22:15 PM 20 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 
02:22:15 PM 21 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 
02:22:15 PM 22 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 
02:22:15 PM 23 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 

我想抓住位於第4列和第3行的值[3] [ 4],即在bash/python/perl中每隔20秒78.22。 因此,我想要的腳本將執行mpstat命令並打印出指定列中的值,並根據它創建圖形的值。我正在考慮在.dat文件中追加所需的值,並運行gnuplot或創建圖形的應用程序。

有關如何去的任何建議?

回答

4

您可以使用awk獲得第3排和第4個單元格。以下代碼從mpstat的輸出中抓取此單元,並將其與當前UNIX時間戳一起附加到統計文件。

mpstat -u 1 -P ALL | awk 'NR==4 {print systime(), $4}' >> stats.txt 

要運行這個命令每20秒:

watch -n 20 "mpstat -u 1 -P ALL | awk 'NR==4 {print systime(), \$4}' >> stats.txt" 

然後用gnuplot情節:

cat stats.txt | gnuplot -p -e 'set datafile separator " "; plot "-" using 1:2 with lines' 
+0

在執行此操作時:mpstat -u 1 -P ALL | awk'NR == 4 {print systime(),$ 4}'>> stats.txt,stats.txt最終是一個空文件。 –

+0

另外我看到的是,它不會打印出連續性的值,而是打印一次並停止。我的目標是不斷保持CPU使用率的選項卡,直到進程運行,因此這是不夠的,但對它的一些改進將會很棒。 –

+0

您可以用'while'循環或(我最喜歡的)'watch'重複該命令。更新了原來的答案。 –

0

請嘗試以下

#!/bin/bash 
function _mpstat() { 
    while :; do 
     arr=($(mpstat -P 1 | tail -n 1)) 
     echo "${arr[3]}" 
     sleep 20 
    done >> file.txt 
} 
_mpstat & 
echo "_mpstat PID: $!" 

Expla國家

  • while :; do無限循環
  • $(mpstat -P 1 | tail -n 1) MPSTAT只有CPU 1 -P 1和尾部-n 1最後一行,返回值$()
  • arr=(...)命令的返回值以陣列
  • echo "${arr[3]}"回波數組索引3
  • sleep 20睡眠20秒
  • >> file.txt在while循環塊內將stdout發送到文件。
  • _mpstat &發送功能,後臺進程&
  • echo "_mpstat PID: $!返回的功能

PID你可以grep PID以顯示其母公司和扼殺了需要的時候。