私はbashスクリプトを持っています。しかし:私は(Ctrlキー+ C)でキャンセルした場合1つのbashスクリプトを持つ2台のノードサーバを実行し、受信コンソールログは
- 私はそう、私はうるさく手動をする必要が、プロセスが終了していない私のターミナルウィンドウ
- で(にconsole.logなどからの)任意の出力を受信しません。後にtaskkill/F/PID等を行う。
とにかくこの周辺にはありますか?
私はbashスクリプトを持っています。しかし:私は(Ctrlキー+ C)でキャンセルした場合1つのbashスクリプトを持つ2台のノードサーバを実行し、受信コンソールログは
とにかくこの周辺にはありますか?
Ctrl + Cでバックグラウンドジョブを停止できない理由は、信号(この場合はSIGINT
)がフォアグラウンドプロセスによってのみ受信されるためです。
すると、あなたのフォアグラウンド・プロセス(非対話メインスクリプト)が終了、その子プロセスがすぐにinit
プロセスで採用されているorphansなります。それらを殺すには、それらのPIDが必要です。 (あなたが対話シェルのバックグラウンド・プロセスを実行すると、それはSIGHUP
、おそらく終了、シェルが終了を受け取ることになります。)
あなたのケース内の溶液は、その子用スクリプト待ち時間を作ることです、シェル内蔵のwait
コマンドを使用します。 wait
は、スクリプトがあなたがして(trap
で)処理し、(kill 0
付き)バックグラウンドジョブを殺すことができるSIGINT
を受け取るようになります:
#!/bin/bash
trap 'kill 0' EXIT
node app1.js &
node app2.js &
wait
EXIT
(bash
で特別な疑似信号)にtrap
を設定することで、あなたを「バックグラウンド・プロセスは、あなたのメインのスクリプトが終了したび(どちらかによってはCtrl + C/SIGINT
、またはSIGTERM
、SIGHUP
、SIGKILL
のような他の信号によって)を終了することを確認でしょう。 kill 0
コマンドは、現在のプロセスグループ内のすべてのプロセスを強制終了します。
出力について - Linux上で、バックグラウンド・プロセスは、シェルの標準出力/エラー(リダイレクトされていない場合)を継承し、あなたのTTY /端末に書き込みをしていきます。それがWindows上で動作していない場合、私はなぜそうではないか分かりません。
しかし、あなたのバックグラウンドプロセスが何らかの形であなたのTTYに自分の道を失った場合でも、あなたは、回避策として、ログファイルに追加することができます
node app1.js >>/path/to/file.log 2>&1 &
node app2.js >>/path/to/file.log 2>&1 &
、その後tail -f
ログファイル、どちらかこの中に、または他の端末:
tail -f /path/to/file.log
素晴らしいコメントと説明をありがとう。 Ctrl + Cはまだ私のために働いていないようです。しかし、それは大きな問題ではない、シェルを閉じることは、すべてのバックグラウンドプロセスを殺すようだ。ノードスクリプトからのログメッセージがどのように私のシェルに出力されることを保証できるか考えていますか? (私もこのウィンドウを実行していますが、それが問題を引き起こしているのかどうかわかりません。) – Baconbeastnz
はい、これはWindowsの問題です。 Linuxでは、出力はTTYに進み、 'wait'は' Ctrl + C 'を処理します。これを回避するには、出力をファイルに記録し、そのファイルから 'tail -f'をログに記録することができます。そのオプションを答えに加えてみましょう。 – randomir