2017-05-02 8 views
0

특정 프로세스가 실행 중인지 확인하고 NSTask을 시도했지만 ps 명령을 grepl하려고 할 때 오류가 발생합니다 : ps: illegal argument: |.프로세스가 실행 중인지 확인하기 위해 NSTask

아마도 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 응용 프로그램이며 샌드 박스 처리되지 않습니다. 고마워 ..

+1

할 수 있습니다하지 Terminal.app에서 같은 파이프 여러 명령. 두 번째'NSTask'가 필요하고 첫 번째 결과를 표준 입력으로 전달하십시오. – vadian

+0

@vadian : 그건 내가 생각한 것이지만 확실하지 않습니다. 두 번째 NSTask의 문제는 결코 끝나지 않습니다. 첫 번째 작업의 결과를 grep하려고 할 때 멈추는 것처럼 보입니다. nstask가 최선의 방법입니까? –

+0

이 특정 프로세스가 실행 중인지 확인할 수있는 프로세스 이름에 대한 PID를 가져 오는 C 함수 ('sysctl '에 있음)가 있습니다. – vadian

답변

0

당신이 시도하고있는 것을 고려해 볼 때 두 번째 작업이 필요하지 않습니다. 쉘 명령 행을 실행하고 쉘 명령 행을 실행하는 것은 무엇입니까?

설명서에서 sh을 찾아 보면 파이프, 리디렉션 등을 포함한 완전한 명령 줄을 인수로 전달할 수 있습니다. 이제 NSTask을 사용하여 적합한 인수를 전달하는 셸을 실행하십시오.

system, popen 등의 기능을 사용하여 동일한 작업을 수행 할 수도 있습니다.

그런데 셸 명령을 사용하지 않으려면 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

+0

'runningApplications'는 응용 프로그램 번들이 아니라면 작동하지 않을 것입니다. –

+0

@NikoFederov - 죄송합니다. 당신이'notifyd'를 찾고 있다는 것에주의하지 않았기 때문에,'runningApplications'는 옵션이 아닙니다. 쉘에 어떻게 코드를 보여주는 코드가있는 부록을 추가했거나 그것을 피했습니다 ... – CRD