私が収集できるものから。
バックグラウンド ジョブは、ユーザーの端末の読み取りをブロックされます。そうしようとすると、ユーザーがフォアグラウンドに移動して何らかの入力を提供するまで中断されます。 「ユーザーの端末から読み取る」とは、端末から直接読み取ろうとするか、端末の設定を変更することを意味します。
通常はそれが必要ですが、続行するためにユーザー入力が必要なためではなく、ユーザーが入力を提供しようとしているかどうかを確認するために、プログラムが端末から読み取ったり、端末設定を変更したりすることがあります。
http://curiousthing.org/sigttin-sigttou-deep-dive-linux に技術的な詳細が記載されています。
Linux およびその他の Unix システムで、バックグラウンドで実行されているが、まだ stdin
を持つジョブ (または std::cin
) 制御端末 (別名、それが実行されたウィンドウ) に関連付けられている場合、SIGTTIN
が送信されます。 デフォルトでは、プログラムを完全に停止させ、ユーザーがプログラムをフォアグラウンドに持ってくるのを待ちます (fg %job
など) 実際にプログラムに入力を与えることができます。この方法でプログラムが一時停止するのを避けるには、次のいずれかを実行できます:
stdin
を確認してください チャネルは、プログラムが入力する適切なコンテンツを含むファイルにリダイレクトするか、 /dev/null
にリダイレクトすることにより、端末に関連付けられなくなりました 本当に入力が必要ない場合 - 例えばmyprogram < /dev/null &
.stdin
と関連付けられます 去ること。しかし、これは SIGHUP
を引き起こします プログラムに配信される (入出力チャネルで「ハングアップ」が発生したことを意味する) - 通常、これによりプログラムが終了しますが、これは nohup
を使用して回避できます。 - 例えばnohup myprogram &
.プログラムの出力をキャプチャすることに興味がある場合は、おそらくこれが最良のオプションです。これは、上記の両方の信号 (および他のいくつかの信号) を防ぎ、出力を保存して、プログラムの実行に問題があります:
nohup myprogram < /dev/null > ${HOME}/myprogram.log 2>&1 &
はい、それは本当に停止しており、バックグラウンドで動作しなくなりました。生き返らせるには fg
と入力します ジョブ番号