背景、ゾンビ、デーモン、cttyなし-これらの概念は関連していますか?


8

-どのようにこれらのプロセスの概念は一緒に関連してbackgroundzombiedaemonwithout controlling terminal

特にのコンセプトではcontrolling terminal、彼らはどこか近づいているように感じますが、Linuxについての記事を読む子供に嘘をつくことなく説明する必要がある場合など、ストーリーを伝えるための情報はまだあまりありません。

更新#1:たとえば(それが本当かどうかはわかりません)

  • background-- 親なしで残されたバックグラウンドプロセスであるため、zombieフォアグラウンドプロセスはになれませんzombiezombie
  • daemon-- without cttyすべてdaemonsがなしcttyで実行されますが、すべてのプロセスcttydaemons
  • background- daemon- background process再び対話的に実行するために取得することができ、daemon is not
  • zombie- without ctty- zombieがある場合に無関心であるcttyそれに接続されているかどうか
  • background- without ctty- processes彼らが持っている一方で、バックグラウンドに送られctty、そして場合はデーモンやダイなっcttyそれらから取られます

フォアグラウンドプロセスは確かにゾンビになる可能性がありますが、通常はかなりの期間ではありません。シェル(または他のプログラム)がサブプロセスをフォアグラウンドで実行する通常の方法は、fork()自分のコピーをオフにしてexec()、そのコピーで使用することです実行したいものに置き換えて、(実行しwait()たコピーではなく)プログラムの元のインスタンスで使用しますexec()。子が終了しwait()てからその終了ステータスを取得する(プロセステーブルから削除して呼び出し元に返す)までの非常に短い期間に、ゾンビが発生します。
Charles Duffy

@CharlesDuffy子をフォアグラウンドで実行したまま親をバックグラウンドに送ることは可能ですか?
anatly techtonik 2017

では、一般的なジョブ制御、シェルにも孫がすべてでその直接の子とは別であることを知っていません。子供が出るのを待っているだけで、孫が出るのを待っているのなら、それは子供のビジネスです。つまり、親を生成したシェルの観点からは、1つのユニットのみを処理しています。
Charles Duffy

回答:


10

簡単に言うと、リンクがあります。

ゾンビ

終了/終了したが、親がまだwait()システムコールを使用して終了を確認していないプロセス。デッドプロセスはプロセステーブルに保持されるため、親には、子プロセスの子が終了したこと、および終了ステータスが通知されます。通常、子供をフォークするプログラムは、終了時に終了ステータスも読み取るので、親が停止しているかバギーの場合にのみゾンビが表示されます。

見る:

端末、セッション、フォアグラウンド、バックグラウンドの制御

これらは、端末で実行されているシェルのコンテキストでのジョブ制御に関連しています。ユーザーがログインし、セッションが開始され、端末(制御端末)に結び付けられ、シェルが開始されます。シェルは次にプロセスを実行し、ユーザーが望むようにフォアグラウンドとバックグラウンドでそれらを送信します(&プロセスの開始時に使用、で停止^Zfgおよびを使用bg)。端末からの読み取りまたは書き込みを行うと、バックグラウンドのプロセスは停止します。フォアグラウンドのプロセスは、^C端末でヒットすると割り込み信号を受け取ります。(これらの信号を処理するのはカーネルのターミナルドライバーです。シェルは、フォアグラウンドまたはバックグラウンドに送信されるプロセス(グループ)を制御します。

見る:

デーモン

デーモンとして実行されるプロセスは、通常、特定の端末(またはログインセッション、またはシェル)に関連付けられるべきではありません。端末が閉じた場合に信号を受信しないように、制御端末は必要ありません。通常、端末でI / Oを実行する必要もありません。コマンドラインからデーモンを起動するには、端末へのすべての関係を解除する必要があります。つまり、制御セッションを取り除くために新しいジョブを(上記のジョブ制御の意味で)開始し、端末へのファイルハンドルを閉じます。もちろんinit、ログインセッションの外でsystemdなどから開始されたものには、これらの結びつきはありません。

デーモンには制御端末がないため、ジョブ制御の対象ではなく、ジョブ制御の意味で「フォアグラウンド」または「バックグラウンド」にあることは適用されません。また、デーモンは通常、親を再ペアレント化しinitて終了するときにそれらをクリーンアップするため、通常、デーモンはゾンビとは見なされません。

見る:


4

ゾンビは他の人と実際には関係ありません。それは単に終了したプロセスですが、その親プロセスはまだ終了ステータスを読み取っていませんwaitpid()。プロセスにバグがあるか停止していない限り、これらは表示されません。

デーモンは、制御、端末なしで実行されているプログラムです。通常、プログラムを実行すると、プログラムfork()s自体と親が終了するため、シェルはコマンドが終了したと判断し、子プロセスはターミナルから切り離されて、ログインセッションをエスケープします。親プロセスが終了したため、その親プロセスIDは1になります。これは、従来はinitプログラムsystemdでしたが、最近はです。このプロセスにより、ゾンビでオーバーランしないように、子供が死んだときに必ずその子供を刈り取ることができます。

プロセスは、制御端末に関連付けることができます。制御端末は、通常、入力を取得し、出力を送信する場所です。端末は、それに接続されているプロセスに信号を送信し、プロセスグループをフォアグラウンドグループとして識別することもできます。フォアグラウンドグループにあるプロセスは、端末から入力を読み取ることができ、Ctrl-CおよびCtrl-Zを押すと、SIGINTおよびSIGSUSPシグナルが送信されます。端末から読み取ろうとするフォアグラウンドグループにないプロセスは、SIGTSTPで中断されます。

シェルは、実行するように要求するパイプラインコマンドごとに異なるプロセスグループを作成し、ジョブをフォアグラウンドとバックグラウンドの間で移動するフォアグラウンドグループをシフトします。コマンドを実行すると、通常、シェルは新しいプロセスグループを作成し、そのグループをフォアグラウンドグループにします。あなたがそれに接尾辞を付けるならば&、シェルは単に前景グループをそれがあった場所に残し、そのため新しいグループは背景にあります。Ctrl-Zを押すと、SIGSUSPがフォアグラウンドグループに送信されます。これにより、ほとんどのコマンドが一時停止されますが、シェルは一時停止する代わりに、アクティブなフォアグラウンドグループをそれ自体に戻し、新しいコマンドを要求できるようにします。

このbgコマンドは、SIGCONTをプロセスグループに送信して、SIGSUSPで中断された後にバックグラウンドで実行を再開できるようにします。 フォアグラウンドグループを、バックグラウンドで既に実行されている既存のグループの1つにfg変更し、フォアグラウンドにします。


4

では、これらのタイプのプロセスの違いに重点を置いた私の説明を次に示します(短くても有益です)。

  • zombie-終了した(実行が終了した)が、プロセステーブルにエントリがあるプロセス。ゾンビプロセスにはまだ親があり、通常、その存在の要点は、その親プロセスに子の実行結果(終了コードなど)を知らせることです。
  • disowned process(端末を制御せずに)- disownユーザーによって明示的に指定されたか、親プロセスツリーから切り離されるように設計されたプロセス。親プロセスが実行を終了しても、引き続き実行されます。たとえば、ユーザーsshがリモートマシンにアクセスし、Webサーバーのようなものを起動し、それを実行disownしてsshセッションを終了しました。プロセスは親プロセスツリーの一部ではなくなったため、引き続き実行されます。プロセスは、を使用して実行しないこともできますnohup
  • background process-バックグラウンドで実行-出力をユーザーのttyに分割しません。どちらかが&最後に実行されたか、意図的に背景に分岐しました。プロセスをバックグラウンドに送信する他のオプションは、プロセスを開始してを押すことctrl+zです。しかし、親プロセスが終了するとき、バックグラウンドで実行されている子も(終了させるノートを @psusiで-事前事実は、ユーザが端末から開始されたプロセスを有する唯一の真であり、そうでなければ、子プロセスは「orphant」になると取得しますinitプロセス(pid 1)を親として)。
    • daemon-バックグラウンドプロセスとよく似ています。また、バックグラウンドで実行されますが、おそらく(設計上)暗黙的にフォークされました。通常、それはバックグラウンドに静かに座って、いくつかのイベントが発生するのを待ってから、実際の作業(着信接続など)を行います。実際には、デーモンはその設計に応じて、(おそらく)取り消されバックグラウンドプロセスになる可能性があります

この説明がこれらのタイプのプロセスを区別するのに役立つことを願っています。


いいね。プロセステーブルは親に属していますか?ゾンビは主人なしで死ぬのですか?
anatoly techtonik 2017年

テーブルは正しい言葉ではありません。それはむしろプロセスtreeです。はい、確かに、親は子が終了した後に終了するように制限されていません(ただし、子がある種の処理を完了するのを待っていた場合は終了できます)。しかし、親が終了した場合-子は完全に終了します。topターミナルから実行してを押すshift-vと、野生のプロセスツリーを表示できます。
ddnomad 2017年

1
終了する親はその子供を殺しません。孤立した子は、親プロセスIDがinit(1)に変更されています。
psusi

@psusiあなたが正しい、私はそれがターミナルで開始されたプロセスでのみそうであることを忘れていました。正解します。
ddnomad 2017年

「すぐにテーブルから消えます」という文は削除します。しばらくすると自動的にフェードアウトすることを示唆していますが、そうではありません。「消える」というのは非常に具体的な出来事です。
AnoE 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.