2017-11-20 14 views
1

私はbashスクリプトを持っています。しかし:私は(Ctrlキー+ C)でキャンセルした場合1つのbashスクリプトを持つ2台のノードサーバを実行し、受信コンソールログは

  1. 私はそう、私はうるさく手動をする必要が、プロセスが終了していない私のターミナルウィンドウ
  2. で(にconsole.logなどからの)任意の出力を受信しません。後にtaskkill/F/PID等を行う。

とにかくこの周辺にはありますか?

答えて

1

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 

EXITbashで特別な疑似信号)にtrapを設定することで、あなたを「バックグラウンド・プロセスは、あなたのメインのスクリプトが終了したび(どちらかによってはCtrl + C/SIGINT、またはSIGTERMSIGHUPSIGKILLのような他の信号によって)を終了することを確認でしょう。 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 
+0

素晴らしいコメントと説明をありがとう。 Ctrl + Cはまだ私のために働いていないようです。しかし、それは大きな問題ではない、シェルを閉じることは、すべてのバックグラウンドプロセスを殺すようだ。ノードスクリプトからのログメッセージがどのように私のシェルに出力されることを保証できるか考えていますか? (私もこのウィンドウを実行していますが、それが問題を引き起こしているのかどうかわかりません。) – Baconbeastnz

+0

はい、これはWindowsの問題です。 Linuxでは、出力はTTYに進み、 'wait'は' Ctrl + C 'を処理します。これを回避するには、出力をファイルに記録し、そのファイルから 'tail -f'をログに記録することができます。そのオプションを答えに加えてみましょう。 – randomir

関連する問題