2011-09-26 94 views
1

我想要執行top並獲取結果,以便知道進程使用了​​多少內存。從Cocoa應用執行終端命令top

首先,我想執行一個終端命令。我使用這個問題的代碼 Execute a terminal command from a Cocoa app

我嘗試了正常運行時間,它的工作完美無瑕。

但是,當我試圖用的,而不是正常運行時間上面,我得到以下錯誤:

錯誤打開終端:未知。

或者,top位於/ usr/bin/top,我不知道它爲什麼拒絕使用它。

這裏是我的代碼:

NSTask *task; 
    task = [[NSTask alloc] init]; 
    [task setLaunchPath: @"/usr/bin/top"]; 

    /*NSArray *arguments; 
    arguments = [NSArray arrayWithObjects: @"foo", @"bar.txt", nil]; 
    [task setArguments: arguments];*/ 

    NSPipe *pipe; 
    pipe = [NSPipe pipe]; 
    [task setStandardOutput: pipe]; 

    NSFileHandle *file; 
    file = [pipe fileHandleForReading]; 

    [task launch]; 

    NSData *data; 
    data = [file readDataToEndOfFile]; 

    NSString *string; 
    string = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding]; 
    [label setStringValue: string]; 

    [string release]; 
    [task release]; 

第二個問題:我試圖做的事是知道多少內存使用谷歌瀏覽器。 因爲它爲每個選項卡使用一個進程,所以很難知道它總共使用了多少memeroy。

問題1:每秒都會更改其值,我怎樣才能得到一個值? 問題2:如何在頂部結果中搜索以僅查找我想要的過程(因爲我知道他們的名字)。

謝謝。

回答

3

問題是,像top這樣的命令需要一個終端(=窗口進行交互)來執行。

這意味着他們需要一個真正的窗口上下文,因爲它們在窗口動態顯示結果(清除窗口,在整個終端窗口中顯示「頂部」的輸出,並且更重要的是,每一個更新顯示N秒,重繪全終端窗口)

所以像top命令需要一個真正的「終端」,這是使用top時候爲什麼,用NSTask,它拋出「錯誤打開終端」。


你可能在頂部(man top)的手冊頁面,而不是檢查是否存在是避免命令的動態尋呼,而是輸出一個單杆(不使用ncurse和終端動態顯示)的選項上直接標準輸出(也許試試top -l 1 - 沒有我的Mac在這裏嘗試自己並確認)。

或者更好的解決方案可能是圍繞像ps(或其他?)而不是top這樣的命令,它會給你相同的信息,但直接在stdout上而不是在終端中作爲動態顯示。

+0

NSTask不提供shell。 –

+0

是的,你是對的我從我的回答中刪除了這個thx – AliSoftware

+0

謝謝,我不知道頂部需要一個窗口來執行,現在它是有道理的。我將使用ps或ps的變體。 現在的騷擾任務就是通過給定的理清我需要的信息... –

2

對於你的第一個問題,使用頂部的參數。例如

top -l 1 

這將給出一組輸出。

因此,在代碼:

NSArray *arguments; 
arguments = [NSArray arrayWithObjects: @"-l 1", nil]; 
[task setArguments: arguments]; 

這將成功執行NSTask。

1

對於過程的信息非交互操作,我會用ps代替top