2017-05-02 33 views
0

実行中の特定のプロセスが実行されているかどうかを確認しようとしていて、NSTaskを試してみましたが、psコマンド:ps: illegal argument: |をgrepしようとするとエラーが表示されます。プロセスが実行中かどうかを確認する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); 

私は(プロセスがアクティブな場合)プロセスが実行されている場合、私が知っているように1行を返すように探しています。これはMacアプリケーションであり、サンドボックス化されていません。ありがとう..

+1

あなたはパイプTerminal.appのように複数のコマンドをすることはできません。 2番目の 'NSTask'が必要で、最初の結果を標準入力に渡します。 – vadian

+0

@vadian:それは私が思ったものですが、わかりませんでした。しかし、2番目のNSTaskの問題は、決して終わらないということです。最初のタスクの結果をgrepしようとするとハングアップするようです。 nstaskは最善の方法ですか? –

+0

この特定のプロセスが実行されているかどうかを確認するプロセス名のPIDを取得するCの関数( 'sysctl'にあります)があります。 – vadian

答えて

0

これを解決するには、提案されているように、シェルコマンドラインを実行しようとするものとシェルコマンドラインを実行するものを考慮する必要はありませんか?

このマニュアルでは、shを参照すると、パイプ、リダイレクトなどを含む完全なコマンドラインを引数として渡すことができます。適切な引数を渡してシェルを実行するには、NSTaskを使用してください。

また、Cライブラリ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); 

あなたはもちろんのは、どの試合、1つのまたは2つの行を取得します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

関連する問題