【发布时间】:2017-05-02 19:07:00
【问题描述】:
我正在尝试确定某个特定进程是否正在运行,并尝试使用NSTask,但是当我尝试使用 grep ps 命令时,它给了我一个错误:ps: illegal argument: |。
也许尝试为此使用 nstask 不是最好的方法?
这是我的代码:
NSString *process = @"grep \"/usr/sbin/notifyd\"";
NSTask *task;
task = [[NSTask alloc] init];
[task setLaunchPath:@"/bin/ps"];
NSArray *arguments;
arguments = [NSArray arrayWithObjects:@"ax",process,nil]; // works, but returns all processes
// arguments = [NSArray arrayWithObjects:@"ax", @"|", process,nil]; // returns illegal argument
[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];
NSLog (@"result:\n%@", string);
我希望返回一行(如果进程处于活动状态)让我知道进程是否正在运行。这是一个 mac 应用程序,它没有沙盒。谢谢..
【问题讨论】:
-
您不能像在 Terminal.app 中那样通过管道传输多个命令。您需要第二个
NSTask并将第一个的结果传递给标准输入。 -
@vadian:我就是这么想的,但不确定。第二个 NSTask 的问题是它永远不会完成。尝试 grep 第一个任务的结果时,它似乎挂起。 nstask 是最好的方法吗?
-
有 C 函数(在
sysctl中)可以获取进程名称的 pid,它还可以检查该特定进程是否正在运行。 -
@vadian:我发现了另一种我相信使用
kinfo_proc的方法,谢谢。
标签: objective-c macos cocoa nstask