2013-02-14 74 views
2

首先,我是新手。我有一些Windows腳本和蘋果腳本的經驗,但沒有太多與bash。我想要做的是抓住特定進程的PID和%CPU。然後將%CPU與設定的數字進行比較,如果更高,則殺死進程。我覺得我很接近,但現在我發現了以下錯誤:Bash腳本檢查特定進程的CPU使用情況

[:0.0:語法錯誤:無效的算術運算符(錯誤標記爲」 .0" )

我在做什麼錯誤?這是我到目前爲止的代碼:

#!/bin/bash 
declare -i app_pid 
declare -i app_cpu 
declare -i cpu_limit 
app_name="top" 
cpu_limit="50" 
app_pid=`ps aux | grep $app_name | grep -v grep | awk {'print $2'}` 
app_cpu=`ps aux | grep $app_name | grep -v grep | awk {'print $3'}` 
if [[ ! $app_cpu -gt $cpu_limit ]]; then 
    echo "crap" 
else 
    echo "we're good" 
fi 

很顯然,我要替代回聲中的if/then語句,但它的作用就好像不管什麼樣的CPU負載實際上是說法是正確的(我測試這個由改變-gt到-lt,它仍然迴盪「廢話」

謝謝所有幫助。呵呵,這是在OS X 10.7,如果這是非常重要的。

回答

4

的問題是可以的bash處理小數,你可以乘以100,並用普通整數代替:

#!/bin/bash 
declare -i app_pid 
declare -i app_cpu 
declare -i cpu_limit 
app_name="top" 
cpu_limit="5000" 
app_pid=`ps aux | grep $app_name | grep -v grep | awk {'print $2'}` 
app_cpu=`ps aux | grep $app_name | grep -v grep | awk {'print $3*100'}` 
if [[ $app_cpu -gt $cpu_limit ]]; then 
    echo "crap" 
else 
    echo "we're good" 
fi 

請記住,CPU百分比是應用程序運行狀況的次優度量。如果您有兩個進程在單個核心繫統上運行無限循環,那麼即使他們正在垃圾周圍,同樣優先級的其他應用程序也不會超過33%。

+0

感謝大家的幫助! 至於CPU的百分比,我們實際上有一個過程,開始吃掉CPU,得到100-200%,然後阻止用戶登錄到計算機,殺死進程導致它重新啓動並坐在.1%爲很長時間。 我打算讓這個按需運行的啓動守護進程運行,所以它應該終止進程,所以用戶不必在屏幕鎖定時重新啓動1/3-1/2。 – user2073780 2013-02-15 14:32:43

6

我建議看看ps的設施,以避免多重可怕的事情。

在我的系統(ps從procps的Linux上,GNU AWK)我會做到這一點:

ps -C "$app-name" -o pid=,pcpu= | 
    awk --assign maxcpu="$cpu_limit" '$2>maxcpu {print "crappy pid",$1}' 
0

我用top檢查一些細節。它提供了更多的細節,如CPU時間。

top -l 1 | grep $app_name 
0

我想出了這個,使用頂部和bc。

通過傳遞前使用它:./script apache2 50 # max 50%

如果有很多的PID匹配你的程序的說法,只有一個會被計算的基礎上,如何頂部列出。我本來可以通過抓住他們所有人並擴大比例或其他東西來擴展腳本,但這必須做到。

您也可以傳入一個數字./script.sh 12345 50,這將強制它使用確切的PID。

#!/bin/bash 

# 1: ['command\ name' or PID number(,s)] 2: MAX_CPU_PERCENT 

[[ $# -ne 2 ]] && exit 1 
PID_NAMES=$1 
# get all PIDS as nn,nn,nn 
if [[ ! "$PID_NAMES" =~ ^[0-9,]+$ ]] ; then 
    PIDS=$(pgrep -d ',' -x $PID_NAMES) 
else 
    PIDS=$PID_NAMES 
fi 
# echo "$PIDS $MAX_CPU" 
MAX_CPU="$2" 
MAX_CPU="$(echo "($MAX_CPU+0.5)/1" | bc)" 
LOOP=1 
while [[ $LOOP -eq 1 ]] ; do 
    sleep 0.3s 
    # Depending on your 'top' version and OS you might have 
    # to change head and tail line-numbers 
    LINE="$(top -b -d 0 -n 1 -p $PIDS | head -n 8 \ 
     | tail -n 1 | sed -r 's/[ ]+/,/g' | \ 
     sed -r 's/^\,|\,$//')" 
    # If multiple processes in $PIDS, $LINE will only match\ 
    # the most active process 
    CURR_PID=$(echo "$LINE" | cut -d ',' -f 1) 
    # calculate cpu limits 
    CURR_CPU_FLOAT=$(echo "$LINE"| cut -d ',' -f 9) 
    CURR_CPU=$(echo "($CURR_CPU_FLOAT+0.5)/1" | bc) 
    echo "PID $CURR_PID: $CURR_CPU""%" 
    if [[ $CURR_CPU -ge $MAX_CPU ]] ; then 
     echo "PID $CURR_PID ($PID_NAMES) went over $MAX_CPU""%" 
     echo "[[ $CURR_CPU""% -ge $MAX_CPU""% ]]" 
     LOOP=0 
     break 
    fi 
done 
echo "Stopped" 
0

Erik,我用你的代碼的修改版本來創建一個類似的新腳本。希望你不介意。

bash腳本的過程 使用,以獲得CPU使用率:

nohup ./check_proc bwengine 70 & 

bwegnine是我們希望在進程正在使用CPU的70%以上,以監控70只登錄進程名稱。

檢查日誌在:/var/log/check_procs.log

輸出應該是這樣的:

DATE | TOTAL CPU | CPU USAGE | Process details 

例子:

03/12/14 17:11 |20.99|98| ProdPROXY-ProdProxyPA.tra 

03/12/14 17:11 |20.99|100| ProdPROXY-ProdProxyPA.tra 

鏈接到完整的博客: http://felipeferreira.net/?p=1453

0

這是也有用app_user信息可用於測試當前用戶是否有權終止/修改正在運行的進程。可以通過使用read消除awk或任何其他第三方解析器的需要與必要app_pidapp_cpu獲得沿着這條信息:

read app_user app_pid tmp_cpu stuff <<< \ 
$(ps aux | grep "$app_name" | grep -v "grep\|defunct\|${0##*/}") 

然後,您可以讓您的app_cpu * 100有:

app_cpu=$((${tmp_cpu%.*} * 100)) 

注:包括defunct${0##*/}grep -v防止多個進程匹配$app_name

2
#!/bin/sh 
PROCESS="java" 
PID=`pgrep $PROCESS | tail -n 1` 
CPU=`top -b -p $PID -n 1 | tail -n 1 | awk '{print $9}'` 
echo $CPU 
相關問題