0
私のNodeアプリケーションからripgrepを実行しようとしていて、child_process.spawn
で奇妙な動作が見られました:イベントが発生せず、アプリケーションが終了しない(スポーンコール内のどこかに詰まっています) ):child_process.spawnはイベントを発生しません
import { spawn } from 'child_process';
async function run() {
await spawnWrapper('rg', ['-F', '"demo"'], { cwd: __dirname });
}
export function spawnWrapper(command, args, options) {
return new Promise((resolve, reject) => {
let stdout = '';
let stderr = '';
const child = spawn(command, args, options);
console.log('spawn wrapper');
child.on('close', (code, signal) => {
console.log('close');
resolve({ code, signal, stdout, stderr });
});
child.on('error', (error) => {
console.log('error');
(error as any).stderr = stderr;
reject(error);
});
child.on('exit', (code, signal) => {
console.log('exit');
resolve({ code, signal, stdout, stderr });
});
child.stdout.setEncoding('utf8');
child.stderr.setEncoding('utf8');
child.stdout.on('data', (data) => {
console.log('stdout data');
stdout += data;
});
child.stderr.on('data', (data) => {
console.log('stderr data');
stderr += data;
});
});
}
私はコンソールに「スポーンラッパー」を取得します。他のイベントはありません。私は他のバイナリでこの動作を見たことがありませんでした。おそらくripgrep
と何かがありますが、ノードによって少なくともいくつかのヒントを得るべきではないでしょうか?これをデバッグする方法に関する提案はありますか?
ローカルデバッガを使用して、すべてのJS例外を無効にすることができます。 – niklon
https://gist.github.com/Stuk/6226938この例のchild_processラッパーはcloseイベントを使用しませんが、おそらくそれは必要ではありませんか?このようなクラスの別の例をhttps://github.com/mgenware/promised-spawn – niklon