GNU/Linux >> Linux の 問題 >  >> Linux

バックグラウンドでの Linux プロセス - ジョブで停止しましたか?

私が収集できるものから。

バックグラウンド ジョブは、ユーザーの端末の読み取りをブロックされます。そうしようとすると、ユーザーがフォアグラウンドに移動して何らかの入力を提供するまで中断されます。 「ユーザーの端末から読み取る」とは、端末から直接読み取ろうとするか、端末の設定を変更することを意味します。

通常はそれが必要ですが、続行するためにユーザー入力が必要なためではなく、ユーザーが入力を提供しようとしているかどうかを確認するために、プログラムが端末から読み取ったり、端末設定を変更したりすることがあります。

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 と入力します ジョブ番号


    Linux
    1. Linuxターミナルで冒険に出かけましょう

    2. Linuxコマンドをバックグラウンドで起動し、ターミナルでプロセスをデタッチする方法

    3. fgおよびbgコマンドを使用してLinuxバックグラウンドジョブを管理する方法

    1. Linux –それは制御端末を持っているプロセスですか、それとも制御端末を持っているセッションですか?

    2. Linux で SSH クライアントを閉じた後にバックグラウンド プロセスが停止しないようにする方法

    3. バックグラウンドプロセスのプロセスIDを取得するには?

    1. Linux でのバックグラウンド プロセス

    2. Linux で特定のプログラムのプロセス ID を設定する方法

    3. Linux:コマンド ラインでプログラムを閉じます (強制終了ではありません)。