質問

As a learning project Im writing a simple gui for Apache stresstesting command line tool "ab". It requiers a full URL, including a filename such as index.html or simular, as one of its parameters. If a filename is not specified "ab" echos "Invalid url" and shows a lists of available flags.

I would like to catch this "error" and have tried using NSTasks standarderror output. Can´t really get it to work. Would this even classify as an error that would pipe to a standard error?

Besides validating the URL input before launching the NSTask, do you think I can prevent or rather catch this error?

My simple code:

- (void) stressTest:(NSString *)url withNumberOfRequests:(int)requests sendSimultaneously:(int)connections {

    NSBundle *mainBundle = [NSBundle mainBundle];
    NSString *abPath = [[mainBundle bundlePath] stringByAppendingString:@"/Contents/Resources/ab"];

    NSString* requestsStr = [NSString stringWithFormat:@"%i", requests];
    NSString* connectionsStr = [NSString stringWithFormat:@"%i", connections];

    // Init objects for tasks and pipe
    NSTask *abCmd = [NSTask new];
    NSPipe *outputPipe = [NSPipe pipe];
    [abCmd setLaunchPath:abPath];
    [abCmd setArguments:[NSArray arrayWithObjects:@"-n", requestsStr, @"-c", connectionsStr, url, nil]];
    [abCmd setStandardOutput:outputPipe];
    [abCmd launch];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(readCompleted:) name:NSFileHandleReadToEndOfFileCompletionNotification object:[outputPipe fileHandleForReading]];
    [[outputPipe fileHandleForReading] readToEndOfFileInBackgroundAndNotify];
}

- (void)readCompleted:(NSNotification *)notification {

    NSString * tempString = [[NSString alloc] initWithData:[[notification userInfo] objectForKey:NSFileHandleNotificationDataItem] encoding:NSASCIIStringEncoding];
   [resultTextOutlet setString:tempString];
   [[NSNotificationCenter defaultCenter] removeObserver:self name:NSFileHandleReadToEndOfFileCompletionNotification object:[notification object]];
}
役に立ちましたか?

解決

ab writes its error messages, including usage information, to standard error. You're currently only reading from standard output. To access the error messages or usage information you'll need to allocate a second NSPipe, pass it to -[NSTask setStandardError:], and then read data from it.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top