我尝试确定某个特定进程是否正在运行,并尝试使用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应用程序,它不是沙盒。感谢..
答案 0 :(得分:0)
你不需要第二个任务来解决这个问题,正如所建议的那样,考虑一下你正在尝试什么 - 运行shell命令行,以及运行shell命令行的是什么?
在手册中查找sh
,你会看到你可以传递一个完整的命令行,包括管道,重定向等作为参数。现在使用NSTask
运行shell传递适当的参数。
您还可以使用C库system
,popen
等函数执行相同的工作。
那就是说你可能想避免为此使用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