[英]NSTask to check if process is running
我试图确定某个特定进程是否正在运行,并尝试使用NSTask
但是当我尝试grep ps
命令NSTask
给了我一个错误: 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应用程序,没有沙盒。 谢谢..
如建议的那样,您不需要第二个任务来解决此问题,请考虑您要尝试的操作-运行Shell命令行,以及运行Shell命令行的是什么?
在手册中查找sh
,您会看到可以将其作为参数传递给完整的命令行,包括管道,重定向等。 现在,使用NSTask
运行传递适当参数的外壳程序。
您还可以使用C库system
, popen
等函数来完成相同的工作。
也就是说,您可能想要避免使用shell命令,例如考虑NSWorkspace
的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
然后使用NSString
的containsString:
? 所以:
task.launchPath = @"/bin/ps";
task.arguments = @[@"-ax"];
然后是这样的:
NSData *data = [file readDataToEndOfFile];
NSString *string = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding];
BOOL notifydIsRunning = [string containsString:@"/usr/sbin/notifyd"];
NSLog (@"notifydIsRunning: %@", notifydIsRunning ? @"yes" : @"no");
HTH
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.