40

&現在、記号を使用してプロセスを実行しています。

$ example &

ただし、(私はLinuxの初心者であることに注意してください)そのようなコマンドのほぼ1秒後に、プロセスが停止信号を受信したというメモが表示されることに気付きました。私が行った場合

$ jobs

サンプル プロセスのリストを取得し、"Stopped" という小さなメモを付けます。それは本当に停止していて、バックグラウンドでまったく機能していませんか? それはどのように正確に機能しますか?インターネットからさまざまな情報を入手しています。

4

4 に答える 4

85

Linux およびその他の Unix システムでは、バックグラウンドで実行されているが、そのstdin(またはstd::cin) 制御端末 (ジョブが実行されたウィンドウとも呼ばれる) に関連付けられているジョブには、SIGTTINシグナルが送信されます。完全に停止し、ユーザーがそれをフォアグラウンド (fg %jobまたは同様のもの) に移動して、実際にプログラムに入力を与えることができるようにします。このようにプログラムが一時停止するのを避けるには、次のいずれかを実行できます。

  1. プログラムが入力する適切なコンテンツを含むファイルにリダイレクトするか、実際に入力が必要ない場合は、プログラムstdinチャネルが端末に関連付けられていないことを確認します。/dev/nullmyprogram < /dev/null &
  2. プログラムの起動後にターミナルを終了します。これにより、プログラムとの関連付けstdinがなくなります。ただし、これSIGHUPによりプログラムに a が配信されます (入出力チャネルで「ハングアップ」が発生したことを意味します)。これにより、通常はプログラムが終了しますが、これは、nohupたとえばを使用することで回避できますnohup myprogram &

プログラムの出力をキャプチャすることに興味がある場合は、おそらくこれが最良のオプションです。これは、上記の両方の信号 (および他のいくつかの信号) を防ぎ、出力を保存して、プログラムの実行に問題があります:

nohup myprogram < /dev/null > ${HOME}/myprogram.log 2>&1 &
于 2013-07-13T02:15:14.387 に答える
1

はい、それは本当に停止しており、バックグラウンドで動作しなくなりました。それを元に戻すには、fg job_numberと入力します

于 2013-07-12T18:40:02.440 に答える