ステップ1:確認する spawn
正しい方法で呼び出されるする
まず、child_process.spawn(command、args、options)のドキュメントを確認します。
command
コマンドライン引数をに指定して、指定されたで新しいプロセスを起動しargs
ます。省略した場合args
デフォルトで空の配列になります。
3番目の引数は、追加のオプションを指定するために使用されます。デフォルトは次のとおりです。
{ cwd: undefined, env: process.env }
env
新しいプロセスに表示される環境変数を指定するために使用しますprocess.env
。デフォルトはです。
コマンドライン引数を入力していないことcommand
と、spawn
呼び出し全体が有効であることを確認してください。次のステップに進みます。
手順2:エラーイベントを発行するイベントエミッターを特定する
spawn
、またはの呼び出しごとにソースコードを検索しますchild_process.spawn
。つまり、
spawn('some-command', [ '--help' ]);
そして、そこに「エラー」イベントのイベントリスナーをアタッチすると、「未処理」としてスローされている正確なイベントエミッターに気付くでしょう。デバッグ後、そのハンドラーを削除できます。
spawn('some-command', [ '--help' ])
.on('error', function( err ){ throw err })
;
実行すると、「エラー」リスナーが登録されたファイルのパスと行番号が取得されます。何かのようなもの:
/file/that/registers/the/error/listener.js:29
throw err;
^
Error: spawn ENOENT
at errnoException (child_process.js:1000:11)
at Process.ChildProcess._handle.onexit (child_process.js:791:34)
最初の2行がまだ
events.js:72
throw er; // Unhandled 'error' event
なくなるまでこの手順を繰り返します。次の手順に進む前に、エラーを発生させるリスナーを特定する必要があります。
ステップ3:環境変数を確認する $PATH
が設定されている
次の2つのシナリオが考えられます。
- デフォルトの
spawn
動作に依存しているため、子プロセス環境はと同じになりprocess.env
ます。
- 引数に
env
オブジェクトを明示的に渡しspawn
ていoptions
ます。
どちらのシナリオでPATH
も、生成された子プロセスが使用する環境オブジェクトのキーを検査する必要があります。
シナリオ1の例
// inspect the PATH key on process.env
console.log( process.env.PATH );
spawn('some-command', ['--help']);
シナリオ2の例
var env = getEnvKeyValuePairsSomeHow();
// inspect the PATH key on the env object
console.log( env.PATH );
spawn('some-command', ['--help'], { env: env });
存在しないPATH
(つまり、存在するundefined
)とspawn
、ENOENT
エラーが発生しcommand
ます。実行可能ファイルへの絶対パスでない限り、エラーを特定することができないためです。
PATH
が正しく設定されたら、次の手順に進みます。これは、ディレクトリまたはディレクトリのリストである必要があります。最後のケースは通常です。
手順4:でcommand
定義されたディレクトリのディレクトリに存在することを確認しますPATH
で定義されたディレクトリの少なくとも1つにENOENT
ファイル名command
(「some-command」など)が存在しない場合、Spawnはエラーを生成することがありますPATH
。
の正確な場所を見つけますcommand
。ほとんどのLinuxディストリビューションでは、これはwhich
コマンドを使用して端末から実行できます。(上記のように)実行可能ファイルへの絶対パスが表示されるか、見つからないかどうかが表示されます。
コマンドが見つかったときのwhichとその出力の使用例
> which some-command
some-command is /usr/bin/some-command
コマンドが見つからない場合のwhichとその出力の使用例
> which some-command
bash: type: some-command: not found
インストールが失敗したプログラムは、見つからないコマンドの最も一般的な原因です。必要に応じて各コマンドのドキュメントを参照し、インストールしてください。
commandが単純なスクリプトファイルの場合は、上のディレクトリからアクセスできることを確認してくださいPATH
。そうでない場合は、1つに移動するか、リンクを作成します。
PATH
が正しく設定されていcommand
てアクセス可能であると判断したら、spawn ENOENT
スローせずに子プロセスを生成できるはずです。
exec
最初の引数としてコマンドを渡し、2番目の引数の配列としてオプションを渡すのではなく、コマンド全体を文字列として渡していました。例えば、私はspawn( "adb logcat -c" )
代わりにやっていましたspawn( "adb", [ "logcat", "-c" ] )
。