繁体   English   中英

NSTask检查进程是否正在运行

[英]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库systempopen等函数来完成相同的工作。

也就是说,您可能想要避免使用shell命令,例如考虑NSWorkspacerunningApplications方法。

附录

现在我不在平板电脑上了……这是修改您的代码以使用外壳程序:

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然后使用NSStringcontainsString: 所以:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM