TCPおよびUDPパケットを受信するため、一時停止できないアプリケーションを実行しています。私は最初、同じアプリケーションの3つのプロセスを、異なる引数を使用して、バックグラウンドモードでを使用して実行しました&
。私だけがしたとき$fg
、3つのプロセスすべてがフォアグラウンドになりました。今、私はそれらを再びバックグラウンドに送りたいのですが、中断はしません。どうやってやるの?
TCPおよびUDPパケットを受信するため、一時停止できないアプリケーションを実行しています。私は最初、同じアプリケーションの3つのプロセスを、異なる引数を使用して、バックグラウンドモードでを使用して実行しました&
。私だけがしたとき$fg
、3つのプロセスすべてがフォアグラウンドになりました。今、私はそれらを再びバックグラウンドに送りたいのですが、中断はしません。どうやってやるの?
回答:
まず最初に、フォアグラウンドに存在できるプロセスは3 つではなく1つだけです。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 &
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- Zとbg
。この点でネットワークプログラムについて特別なことは何もありません。着信接続/データはカーネルによって(ある程度まで)バッファリングされます。ただし、ストリーミング接続には一時停止が見られる場合があります。
詳細については、bash manページの「JOB CONTROL」セクションを参照してください。
これを行う最も簡単な方法は、screenプログラムを使用することです。仮想端末内でアプリケーションを起動し、Ctrl + A、Dで画面を終了できます。セッションを再開する場合は、タイプscreen -x
。複数のプロセスがある場合は、再接続する画面のリストが表示されます。詳細はscreenのmanページを読んでください。