我想执行top并获取结果,以便了解进程使用了多少内存。
首先,我想执行一个终端命令。我使用这个问题的代码 Execute a terminal command from a Cocoa app
我尝试了正常运行时间,效果完美。
但是,当我尝试使用 top 而不是 uptime 时,出现以下错误:
打开终端时出错:未知。
或者,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];
第二个问题:我想做的是了解 Google Chrome 使用了多少内存。 因为它为每个选项卡使用一个进程,所以很难知道它总共使用了多少内存。
问题1:top的值每秒都在变化,如何获取值? 问题 2:如何在 top 的结果中搜索以便仅查找我想要的进程(假设我知道它们的名称)。
谢谢。
最佳答案
问题是像top这样的命令需要终端(=与之交互的窗口)来执行。
这意味着他们需要一个真实的窗口上下文,因为他们在窗口中动态显示结果(清除窗口,在整个终端窗口中显示“top”的输出,更重要的是,每 N 秒更新一次显示,重绘整个终端窗口)
因此,像 top
这样的命令需要一个真正的“终端”,这就是为什么当将 top
与 NSTask
一起使用时,它会抛出“错误”打开终端”。
如果有一个选项可以避免命令的动态分页,而是输出单个镜头(不使用 ncurse 和终端动态),您可以查看 top 的手册页 (man top
)显示)直接在标准输出上(也许可以尝试 top -l 1
-- 没有我的 Mac 来尝试并确认)。
或者更好的解决方案可能是挖掘像 ps
(或其他?)这样的命令,而不是 top
,它会给你相同的信息,但直接在 stdout 而不是作为终端中的动态显示。
关于objective-c - 从 Cocoa 应用程序执行终端命令 top,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7553410/