node.jsでプロセスを起動・終了させる
質問
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();
これでうまくいくといいのですが。
関連
-
[解決済み] JavaScriptで "use strict "は何をするのか、その根拠は?
-
[解決済み] let "と "var "の使い分けは?
-
[解決済み] package.jsonのチルダ(~)とキャレット(^)の違いは何ですか?
-
[解決済み] Node.jsのプログラムにコマンドライン引数を渡すにはどうしたらいいですか?
-
[解決済み] Node.jsを使うタイミングをどう判断するか?
-
[解決済み] Node.jsで終了する方法
-
[解決済み] Node.jsでファイルを書き込む
-
[解決済み] Node.jsアプリケーションをデバッグするにはどうすればよいですか?
-
[解決済み] Node.jsを完全にアンインストールして、最初から再インストールする方法 (Mac OS X)
-
[解決済み] Node.jsのmodule.exportsの目的と使い方を教えてください。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] ジェスト あるクラスの特定のメソッドをモックする方法
-
[解決済み] Javascriptによるタッチスクリーンデバイスの検出
-
[解決済み] なぜJavaScriptでは!{}[true]がtrueに評価されるのですか?
-
[解決済み] TypeScriptのdeclare classとinterfaceの違いとは?
-
[解決済み] javascriptで文字列から関数を作成する方法はありますか?
-
[解決済み] モデルフェッチ時に1をtrueに、0をfalseに変換する方法
-
[解決済み] 文字列とラベルのローカライズとグローバリゼーションのベストプラクティス【終了しました
-
[解決済み] Prototypeを使ってtextareaを自動サイズ調整するには?
-
[解決済み] jQueryを使用して、すべてのクリックイベントハンドラを削除するにはどうすればよいですか?
-
[解決済み] jQueryのバージョン1、バージョン2、バージョン3の違いは何ですか?[クローズド]