2013-07-29 33 views
2

爲什麼我一直在收到錯誤「無法將\」0.0 \「編入編號。」從「0.0」到數字-1700?如果我刪除作爲編號,顯示對話框始終顯示。「無法將」0.0 「編入類型編號。」編號-1700從「0.0」到編號

tell application "System Events" 
    repeat 
     set PID to unix id of process "JPEGmini" 
     set getCpuPercent to "ps aux | grep " & PID & " | grep -v grep | awk '{print $3}'" 
     set cpuPercent to (do shell script getCpuPercent) as number 

     if (cpuPercent) < 5 then 

      display dialog cpuPercent 

     end if 
    end repeat 
end tell 
+0

您看到此消息的時間可能已經太晚了,但請不要忘記您對此問題給予的獎勵。它昨天過期,寬限期結束於3小時。對於你的問題,你有3個正確的答案,所以獎賞獎賞應該沒有問題,更不用說通常的提議和回答接受了。謝謝。 –

回答

1

這裏的問題是您的ps命令返回的信息太多。爲了說明我的意思,正如我寫的,我的谷歌瀏覽器進程的pid爲916.在問題中使用該方法,我可以使用ps aux | grep 916來查看此過程。但這還不夠 - grep將匹配ps輸出中字符串「916」的任何實例,所以如果碰巧有一個pid爲1916或9160的進程,那麼它也會匹配。 ps aux還列出了很多其他統計數據,其中很多數據可能還包含字符串「916」。事實上,如果我運行ps aux | grep -c 916目前有58行匹配!

所以我們需要做的是告訴ps我們只是在一個特定的PID感興趣:

$ ps -o%cpu -p 916 | grep '[[:digit:]]' 
    0.5 
$ 

這將列出只有CPU%與給定$ PID的進程。需要管道到grep '[[:digit:]]'才能返回數字百分比,並從ps輸出中除去「CPU」列標題。

包裝這件事到您的原始腳本,你必須:

tell application "System Events" 
    repeat 
     set PID to unix id of process "JPEGmini" 
     set getCpuPercent to "ps -o%cpu -p " & PID & " | grep '[[:digit:]]'" 
     set cpuPercent to (do shell script getCpuPercent) as number 

     if (cpuPercent) < 5 then 

      display dialog cpuPercent 

     end if 
    end repeat 
end tell 

我沒有安裝JPEGmini,但這個工作正常,我對我已在OSX 10.8.5的PowerBook嘗試了其他所有工序。

1

我試過你的腳本與Safari的過程,也得到了錯誤。看起來有多個結果從「do shell腳本」行返回......所以它不能將結果變成數字。

我改變了代碼,這和它的工作...

tell application "System Events" 
    repeat 
     set PID to unix id of process "Safari" 
     set getCpuPercentCmd to "ps aux | grep " & PID & " | grep -v grep | awk '{print $3}'" 
     set getCpuPercent to paragraphs of (do shell script getCpuPercentCmd) 
     set cpuPercent to (item -1 of getCpuPercent) as number 

     if cpuPercent < 5 then 
      display dialog cpuPercent as text 
     end if 
    end repeat 
end tell 
+0

getCpuPercent的item-1是不夠的 - 這隻會給出'ps'輸出的最後一行,但是如果有多行被'grep PID'匹配,那麼我們感興趣的過程不能保證是'ps'輸出的最後一行中列出的那個。 –

+0

你說得對。我應該更好地解釋它。我試圖展示問題的海報,他得到的結果具有超過1的價值,這就是爲什麼他的「作爲數字」的強制不起作用。所以我使用「段落」將多個值的字符串轉換爲多個值的列表。他需要了解有關流程的一些信息,以確定他需要的列表中的哪個結果。或者他可以在列表上使用重複循環並評估每個結果。 – regulus6633

1

我剛跑了grep命令,發現在我的機器WebKit是運行的是綁在Safari瀏覽器的PID一個WebProcess。您可以看到第二行的末尾-servicenamecom.apple.WebKit.WebProcess-4881-0x1076eb0c0。因此,grep實際上找到了兩個結果並返回"0.0\r0.0",它不能編入一個數字。

$user  4881 13.3 1.2 3812416 104840 ?? R  4:27PM 0:09.57 /Applications/Safari.app/Contents/MacOS/Safari -psn_0_1692061 
$user  4885 0.1 0.7 3778328 56108 ?? S  4:27PM 0:00.79 /System/Library/StagedFrameworks/Safari/WebKit2.framework/WebProcess.app/Contents/MacOS/WebProcess /System/Library/StagedFrameworks/Safari/WebKit2.framework/WebKit2 -type webprocess -servicename com.apple.WebKit.WebProcess-4881-0x1076eb0c0 -localization en_US -client-identifier com.apple.Safari -ui-process-name Safari 
$user  5250 0.0 0.0 2432768 520 ?? R  4:29PM 0:00.00 grep 4881 
$user  5248 0.0 0.0 2433432 824 ?? S  4:29PM 0:00.00 sh -c ps aux | grep 4881