web-dev-qa-db-ja.com

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

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

11

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

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

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

10
Stefan Seidel

あなたが本当にフォアグラウンドジョブを持っているなら、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であり、どちらの信号も機能するはずです)。

processesjobsの間には、前景と用語の微妙な違いがあります。背景が使用されます。シェルフォアグラウンドジョブは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 "」セクションを参照してください。

2
mr.spuratic

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

1
Janos Pasztor