본문 바로가기

TechLog

코코아 응용 프로그램에서 터미널 커맨드 실행하기

* 참고: http://stackoverflow.com/questions/412562/execute-a-terminal-command-from-a-cocoa-app/12310154#12310154

 

내부에 포함된 웹 서버를 시작/중지하는 코코아 응용 프로그램을 작성해야 할 일이 생겨서, 터미널 명령을 실행하는 메서드를 작성하느라 이것저것 고민하다가, 스택오버플로에서 어떤 유저가 /bin/sh 유틸리티를 통해 셸 스크립트 파일을 실행하는 메서드를  작성해 놓은 것을 찾아냈다(아마 한글을 모르는 유저라서 이 글을 읽진 못하겠지만, thanks kent!). 사실 /bin/sh 유틸리티는 –c 옵션을 사용하면 라인 단위의 명령도 실행할 수 있기 때문에, 메서드 내용을 조금 고쳐서 커맨드를 라인 단위로 수행할 수 있도록 구현해 보았다:

NSString *runCommand(NSString *commandToRun)
{
   
NSTask *task;
    task
= [[NSTask alloc] init];
   
[task setLaunchPath: @"/bin/sh"];

   
NSArray *arguments = [NSArray arrayWithObjects:
                         
@"-c" ,
                         
[NSString stringWithFormat:@"%@", commandToRun],
                          nil
];
   
NSLog(@"run command: %@",commandToRun);
   
[task setArguments: arguments];

   
NSPipe *pipe;
    pipe
= [NSPipe pipe];
   
[task setStandardOutput: pipe];

   
NSFileHandle *file;
    file
= [pipe fileHandleForReading];

   
[task launch];

   
NSData *data;
    data
= [file readDataToEndOfFile];

   
NSString *output;
    output
= [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding];
   
return output;
}

 

위 명령은 터미널 명령 수행하듯, 다음과 같이 사용하면 된다:

NSString *output = runCommand(@"ps -A | grep mysql");