NSTask检查进程是否正在运行

时间:2017-05-02 19:07:00

标签: objective-c macos cocoa nstask

我尝试确定某个特定进程是否正在运行,并尝试使用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应用程序,它不是沙盒。感谢..

1 个答案:

答案 0 :(得分:0)

你不需要第二个任务来解决这个问题,正如所建议的那样,考虑一下你正在尝试什么 - 运行shell命令行,以及运行shell命令行的是什么?

在手册中查找sh,你会看到你可以传递一个完整的命令行,包括管道,重定向等作为参数。现在使用NSTask运行shell传递适当的参数。

您还可以使用C库systempopen等函数执行相同的工作。

那就是说你可能想避免为此使用shell命令,例如考虑NSWorkspace的{​​{1}}方法。

<强>附录

现在我不在平板电脑上......以下是您修改的代码以使用shell:

runningApplications

你当然会得到一两行匹配,因为NSTask *task = [NSTask new]; task.launchPath = @"/bin/sh"; task.arguments = @[@"-c", @"ps -ax | grep /usr/bin/notifyd"]; NSPipe *pipe = [NSPipe pipe]; task.standardOutput = pipe; NSFileHandle *file = [pipe fileHandleForReading]; [task launch]; NSData *data = [file readDataToEndOfFile]; NSString *string = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding]; NSLog (@"result:\n%@", string); 的一行总是在那里。为什么不运行grep然后使用ps -ax的{​​{1}}?所以:

NSString

然后像:

containsString:

HTH