从Cocoa应用程序执行终端命令top

时间:2011-09-26 09:56:34

标签: objective-c cocoa

我想执行top并获取结果,以便知道进程使用了​​多少内存。

首先,我想执行一个终端命令。我使用这个问题的代码 Execute a terminal command from a Cocoa app

我尝试了正常运行时间,它完美无缺。

但是,当我尝试使用top而不是正常运行时间时,我收到以下错误:

打开终端时出错:未知。

或者,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:top每秒都会改变它的值,我怎样才能得到一个值? 问题2:我如何搜索top的结果才能找到我想要的进程(假设我知道他们的名字)。

感谢。

3 个答案:

答案 0 :(得分:3)

问题是像top这样的命令需要终端(=与之交互的窗口)才能执行。

这意味着他们需要一个真实的窗口上下文,因为它们在窗口中动态显示结果(清除窗口,在整个终端窗口中显示“top”的输出,更重要的是,每N秒更新一次显示,重新绘制整个终端窗口)

因此像top这样的命令需要一个真正的“终端”,这就是为什么在top使用NSTask时,它会抛出“错误打开终端”。


如果有一个选项可以避免动态分页命令而是直接输出单个镜头(不使用ncurse和终端动态显示),您可以检查顶部(man top)的手册页。 stdout(也许试试top -l 1 - 不要让我的Mac尝试自己并确认)。

或者更好的解决方案可能是挖掘ps(或其他?)而不是top之类的命令,这些命令会直接在stdout上提供相同的信息,而不是作为动态显示终端

答案 1 :(得分:2)

关于第一个问题,请使用top的参数。例如

top -l 1

这将给出一组输出。

因此在代码中:

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

这将成功执行NSTask。

答案 2 :(得分:1)

对于包含流程信息的非交互式操作,我会使用ps代替top