中断せずにフォアグラウンドプロセスをバックグラウンドにすることは可能ですか(control + z)?


11

TCPおよびUDPパケットを受信するため、一時停止できないアプリケーションを実行しています。私は最初、同じアプリケーションの3つのプロセスを、異なる引数を使用して、バックグラウンドモードでを使用して実行しました&。私だけがしたとき$fg、3つのプロセスすべてがフォアグラウンドになりました。今、私はそれらを再びバックグラウンドに送りたいのですが、中断はしません。どうやってやるの?


ここでは新しい画面インスタンスに実行中のプロセスの移動についてServerFaultのトピックがある- > serverfault.com/questions/55880/...
アラン・バーバー

回答:


10

まず最初に、フォアグラウンドに存在できるプロセスは3 つではなく1つだけです。fg最新のプロセスを前面に表示します。Ctrl+ のプロセスを作成し、問題のアプリケーションを「妨害」しないようにすばやくz入力しますbg(プロセススケジューラはこれを1秒あたり何回も行うことに注意してください)。プロセスのPIDをフォアグラウンドで確認し、次に2番目のターミナルで確認します。 / SSHセッション、使用

kill -SIGSTOP »pid« ; kill -SIGCONT »pid«

元の端末にはと表示さstoppedれますが、SIGCONTすぐに送信したため、プロセスはバックグラウンドで実行され続けます。


1
@stefen:あなたのソリューションは説得力があります。プロセスを一時停止しても、確立されたソケット接続が切断されない場合(スケジューラの切り替えでソケット接続が切断されないことを確認している場合)は、プロセスに害を及ぼすことはありません。これをデバッグして更新します。どうもありがとう。If
rahul.deshmukhpatil 2013年

2

あなたが本当にフォアグラウンドジョブを持っているなら、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 &

ncatこのために、3つのバックグラウンドリスニングプロセスを開始しました。ジョブのステータスについては、「完了」または「停止」が表示される場合もあります。

Stefan SeidelのSIGSTOP / SIGCONTメソッドを使用して、別のシェルからフォアグラウンドジョブを効果的にバックグラウンドで実行できます(-を使用してシェルから送信される実際の信号はSIGTSTPですが、どちらの信号も機能するはずです)。CtrlZ

フォアグラウンドとバックグラウンドという用語を使用する場合、プロセスジョブの間には微妙な違いがあります。シェルフォアグラウンドジョブは1つだけで、複数のフォアグラウンドプロセスが存在する可能性があります(これは端末プロセスグループIDに関連し、パイプラインで2つ以上のプロセスを開始すると確認できます)。

あなたが使用している場合、シェルの制御下で実行中のプロセスやパイプラインは、「ジョブ」と呼ばれているbgか、fgあなたがしているコマンドを暗黙のうちに私の場合のものを-最新の仕事を参照する+上記に。これらのジョブは、(特に)%1%2または%3(の数字)として明示的に参照することもでき[]ます。

修飾されていないfgコマンドは、最新の1つのジョブにのみ影響を与えるため、現在の状況の理解が誤っている可能性があります。バックグラウンドジョブ引き続きターミナルに書き込みます。

  echo foo > /dev/tcp/127.0.0.1/10111

これは、プログラムが端末を処理する方法に依存する可能性がありncat、書き込みに適しています。ただし、プログラムを読み取ると実行が停止し、「Stopped」というメッセージが表示されます。シェルはプロセスを開始し、プロセスが終了するか、SIGTTINシグナルを受信するまで待機します(これnohupは回避策ですdisown)。

特定の停止したジョブをバックグラウンドで

$ bg %3

(私の場合、エラーが発生しますbash: bg: job 3 already in background

プログラムはSIGTSTPをキャッチし、何か特別なをしない限り、プロセスは、フォアグラウンドにあるそれ以外の場合は、それが迅速に問題を持っているそうだCtrl- Zbg。この点でネットワークプログラムについて特別なことは何もありません。着信接続/データはカーネルによって(ある程度まで)バッファリングされます。ただし、ストリーミング接続には一時停止が見られる場合があります。

詳細については、bash manページの「JOB CONTROL」セクションを参照してください。


1

これを行う最も簡単な方法は、screenプログラムを使用することです。仮想端末内でアプリケーションを起動し、Ctrl + A、Dで画面を終了できます。セッションを再開する場合は、タイプscreen -x。複数のプロセスがある場合は、再接続する画面のリストが表示されます。詳細はscreenのmanページを読んでください


5
彼は「事後」の解決策を探していると思います。つまり、プロセスは現在実行中です。
Stefan Seidel
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.