2011-09-26 96 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