1. ホーム
  2. javascript

node.jsでプロセスを起動・終了させる

2023-09-26 16:16:50

質問

javascriptでプロセスを起動し、しばらくしてから終了させようとしています(テスト用)。

最終的に、プロセスは無限ループになり、私は指定された時間に異なる引数で再起動する必要があるので、プロセスを生成してそれを殺すことがこれを行うための最良の方法だと思いました。

私のテストコードは

var spawn=require('child_process').spawn
, child=null;

child=spawn('omxplayer', ['test.mp4'], function(){console.log('end');}, {timeout:6000});
console.log('Timeout');
setTimeout(function(){
    console.log('kill');
    child.kill();
}, 1200);

child.stdout.on('data', function(data){
    console.log('stdout:'+data);
});

child.stderr.on('data', function(data){
    console.log('stderr:'+data);
});

child.stdin.on('data', function(data){
    console.log('stdin:'+data);
});

という結果になります。

#~$ node test.js
Timeout
kill

しかし、私はまだプログラムを終了するためにctrl+Cを送信する必要があります。何が足りないのでしょうか?

Raspbian, node 0.10.17 では、omxplayer はバイナリ(ビデオプレーヤー)です。

試してみました。

  • 追加された chmod +x をアプリに追加しました。
  • ルートとして起動。
  • 子プロセスの stdin を一時停止しました。killコマンドですべての終了関連シグナルを使用。

また、起動した ps コマンドをアプリの実行中に起動しました。

2145    bash
2174    node
2175    omxplayer
2176    omxplayer.bin
2177    ps

omxplayerはラッパーであり、終了時に子プロセスを殺すことはありません。

まだ埃をかぶっていますが、これを試してみました。

spawn('kill', ['-QUIT', '-$(ps opgid= '+child.pid+')']);

これは、私はomxplayerのすべての子を殺すだろうと思った、私はそのようにspawnを使用することが間違っているか、それが動作しないコードであるかどうかわかりません。

私が行った最後の編集は良い答えでしたが、少し編集する必要がありました。

こんな感じのshファイル(execute権付き)を作りました。

PID=$1
PGID=$(ps opgid= "$PID")
kill -QUIT -"$PGID"

という感じで始めます。

execF('kill.sh', [child.pid], function(){
    console.log('killed');
});

の代わりに child.kill .

これが最善の方法かどうか、またコードがきれいかどうかはわかりませんが、動作はします。

よりきれいな方法で、あるいはさらに良いことに、ファイルを実行することなくそれを作るどんな答えでも受け入れます。

どのように解決するのですか?

参照先 この議論

stdinのデータを待ち始めると、nodeはstdinからの入力を待つように指示されるまで待ちます。ユーザーがctrl-dを押すか(入力の終了を意味する)、プログラムがstdin.pause()を呼び出すと、nodeはstdinの待ち受けを停止します。

nodeのプログラムは何もすることがないか、待つことがない限り、終了することはありません。何が起こっているかというと、stdinで待機しているため、決して終了しないのです。

setTimeoutコールバックを次のように変更してみてください。

console.log('kill');
child.stdin.pause();
child.kill();

これでうまくいくといいのですが。