如何使用 NSTask 获得类似于 Tail -f 的内容
我需要实时读取日志文件中最后添加的行,并捕获正在添加的该行。
类似于 Tail -f 的东西。
所以我的第一次尝试是使用 NSTask 来使用 Tail -f 。
使用下面的代码我看不到任何输出:
NSTask *server = [[NSTask alloc] init];
[server setLaunchPath:@"/usr/bin/tail"];
[server setArguments:[NSArray arrayWithObjects:@"-f", @"/path/to/my/LogFile.txt",nil]];
NSPipe *outputPipe = [NSPipe pipe];
[server setStandardInput:[NSPipe pipe]];
[server setStandardOutput:outputPipe];
[server launch];
[server waitUntilExit];
[server release];
NSData *outputData = [[outputPipe fileHandleForReading] readDataToEndOfFile];
NSString *outputString = [[[NSString alloc] initWithData:outputData encoding:NSUTF8StringEncoding] autorelease];
NSLog (@"Output \n%@", outputString);
使用以下代码时我可以看到预期的输出:
[server setLaunchPath:@"/bin/ls"];
-
如何捕获该尾部 NSTask 的输出?
-
此方法是否有任何替代方法,我可以打开文件流并每次添加行时将其输出到屏幕上? (基本日志记录功能)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
按照您的方式执行此操作有点棘手,因为
readDataToEndOfFile
将等到tail
关闭输出流后再返回,但tail -f
永远不会关闭输出流(stdout)。然而,使用基本 CI/O 代码实际上非常简单,因此我创建了一个简单的 FileTailer 类,您可以查看一下。这不是什么奇特的东西,但它应该向您展示它是如何完成的。以下是FileTailer.h
、FileTailer.m
和 测试驱动程序。这门课的内容非常简单。您向它传递一个块,它从流中读取一个字符(如果可能)并将其传递给该块;如果达到 EOF,它会等待几秒(由
refresh
确定),然后尝试再次读取流。您可以非常简单地调用它,如下所示:
(注意:我很快就编写了
FileTailer
类,因此它现在有点丑陋,应该清理一下,但它应该可以使用作为一个关于如何无限期地读取文件的不错的例子,à latail -f
。)This is a little tricky to do your way, as
readDataToEndOfFile
will wait untiltail
closes the output stream before returning, buttail -f
never closes the output stream (stdout). However, this is actually pretty simple to do with basic C I/O code, so I whipped up a simpleFileTailer
class that you can check out. It's not anything fancy, but it should show you how it's done. Here're the sources forFileTailer.h
,FileTailer.m
, and a test driver.The meat of the class is pretty simple. You pass it a block, and it reads a character from the stream (if possible) and passes it to the block; if EOF has been reached, it waits a number of seconds (determined by
refresh
) and then tries to read the stream again.You can call it pretty simply, like this:
(Caveat: I wrote the
FileTailer
class pretty fast, so it's kind of ugly right now and should be cleaned up a bit, but it should serve as a decent example on how to read a file indefinitely, à latail -f
.)以下是在 Objective-C 中通过 NSTask 使用“tail -f logfile”的方法:
asynctask.m 的源代码位于: http://www.cocoadev.com/index.pl ?NSPipe
Here's a way to use "tail -f logfile" via NSTask in Objective-C:
Source code of asynctask.m available at: http://www.cocoadev.com/index.pl?NSPipe