TCPおよびUDPパケットを受信するため、一時停止できないアプリケーションを実行しています。最初は、同じアプリケーションの3つのプロセスを、異なる引数を使用して、バックグラウンドモードで&
。 $fg
、3つのプロセスすべてが前面に出てきました。今、私はそれらを再びバックグラウンドに送りたいのですが、中断することはありません。どうやってやるの?
まず最初に:フォアグラウンドにはoneプロセスしか存在できず、3つすべてが存在するわけではありません。 fg
は、最新のプロセスを前面に押し出します。のプロセスを作るために Ctrl+z、次にbg
と入力して、問題のアプリケーションを「妨害」しないようにし(プロセススケジューラは1秒間に何度もこれを実行することに注意してください)、フォアグラウンドでプロセスのPIDを確認し、次に2番目のターミナルで確認します。/SSHセッション、使用
kill -SIGSTOP »pid« ; kill -SIGCONT »pid«
元の端末にはstopped
と表示されますが、すぐにSIGCONT
を送信したため、プロセスはバックグラウンドで実行され続けます。
あなたが本当にフォアグラウンドジョブを持っているなら、bashはそれが完了するのを待っています、それは多かれ少なかれ フォアグラウンドジョブの定義 です。 bashがまだ端末を制御している場合は、jobs -l
で何が起こっているかを確認してください。例:
$ ncat -kl -p 10111 &
[1] 13404
$ ncat -kl -p 10222 &
[2] 13405
$ ncat -kl -p 10333 &
[3] 13406
$ jobs -l
[1] 13404 Running ncat -kl -p 10111 &
[2]- 13405 Running ncat -kl -p 10222 &
[3]+ 13406 Running ncat -kl -p 10333 &
このために、3つのバックグラウンドncat
リスニングプロセスを開始しました。ジョブステータスとして「完了」または「停止」が表示される場合もあります。
Stefan SeidelのSIGSTOP/SIGCONTメソッドを使用して、別のシェルからフォアグラウンドジョブを効果的にバックグラウンドで処理できます(ただし、 実際に送信されたシグナル =シェルによる Ctrl-Z はSIGTSTPであり、どちらの信号も機能するはずです)。
processesとjobsの間には、前景と用語の微妙な違いがあります。背景が使用されます。シェルフォアグラウンドジョブは1つだけで、複数フォアグラウンドプロセスが存在する可能性があります(これはターミナルプロセスグループIDに関連しており、パイプラインで2つ以上のプロセスを開始したときに観察できます)。
シェルの制御下で実行中のプロセスまたはパイプラインは、bg
またはfg
コマンドを使用する場合、「ジョブ」と呼ばれます暗黙的に最新のジョブを参照します-私の場合、上記の+
を持つジョブ。これらのジョブは、(とりわけ)明示的に%1%2または%3([]
の数値)と呼ばれることもあります。
修飾されていないfg
コマンドは、最新の1つのジョブにのみ影響するため、現在の状況を誤って理解している可能性があります。バックグラウンドジョブmayはまだ端末に書き込みます:
echo foo > /dev/tcp/127.0.0.1/10111
プログラムが端末をどのように処理するかによって異なりますが、ncat
は書き込みに問題なく機能します。ただし、プログラムを読むと実行が停止し、「停止しました」というメッセージが表示されます。シェルはプロセスを開始し、プロセスが終了するかSIGTTINシグナルを受信するのを待ちます(Nohup
は、disown
と同様に、これを回避する方法です)。
特定の停止したジョブをバックグラウンドで処理できます
$ bg %3
(私の場合、エラーbash: bg: job 3 already in background
が発生します)
そうでなければ、プロセスがフォアグラウンドにある場合、プログラムがSIGTSTPをキャッチして特別なことをしない限り、クイックで問題が発生する可能性はほとんどありません。 Ctrl-Z およびbg
。この点でネットワークプログラムについて特別なことは何もありません。着信接続/データはカーネルによって(ある程度まで)バッファリングされます。ただし、ストリーミング接続には、観察可能な一時停止がある場合があります。
詳細については、bashのmanページの「 JOBCONTROL "」セクションを参照してください。
これを行う最も簡単な方法は、screenプログラムを使用することです。仮想端末内でアプリケーションを起動し、Ctrl + A、Dで画面を終了できます。セッションを再開する場合は、タイプscreen -x
。複数のプロセスがある場合は、再接続する画面のリストが表示されます。詳細については、 スクリーンのマニュアルページ をお読みください。