web-dev-qa-db-ja.com

Nohupとデーモンの違いは何ですか?

スクリプトをデーモンとして実行することとnohupを使用することの意味は何ですか?

分岐プロセスなどの点で違いは何ですか?

57
Hortitude

Nohupコマンドは、プロセスをデーモンとして実行する貧しい人の方法です。 Bruno Ranschaertが指摘したように、対話型シェルでコマンドを実行すると、制御端末があり、制御プロセス(通常はログインシェル)が終了するとSIGHUP(ハングアップ)信号を受け取ります。 Nohupコマンドは、入力が/dev/null、および出力とエラーの両方がNohup.out、およびプログラムが割り込みを無視し、シグナルを終了し、ハングアップする場合。実際には同じ制御端末がまだあります-端末の制御を無視します。プロセスをバックグラウンドで実行する場合は、少なくともSolarisでバックグラウンドで実行するようにシェルに指示する必要があることに注意してください(つまり、 'Nohup sleep 20 & ';アンパサンドなしでは、プロセスはフォアグラウンドで同期的に実行されます)。

通常、Nohupを介して実行されるプロセスは時間がかかりますが、他の場所からの対話を待つことはありません。

通常(つまり、一生懸命やるなら、これらのルールの例外を見つけることができます)、デーモンプロセスはバックグラウンドに潜み、端末から切断されますが、何らかの入力に対する応答を待機します。ネットワークデーモンは、接続要求またはUDPメッセージがネットワーク経由で到着するのを待ち、適切な作業を行って、応答を再送信します。たとえば、WebサーバーやDBMSを考えてください。

プロセスが完全にデーモン化されると、Nohupコードが実行するいくつかのステップを実行します。 I/Oを再配置して、どの端末にも接続されないようにし、プロセスグループから自分自身を切り離し、適切な信号を無視します(生成された信号を送信する端末がないため、信号を無視しない可能性があります)ターミナル経由)。通常、それは一度分岐し、親は正常に終了します。子プロセスは通常、プロセスグループやセッションIDなどを修正した後、2回目に分岐します。子も終了します。孫プロセスは自律型になり、起動された端末のps出力に表示されなくなりました。

nix環境での高度なプログラミング、第3版 WリチャードスティーブンスとスティーブンAラゴによる、または 高度なUnixプログラミング、第2版 の議論のためにMarc J Rochkindを見ることができます。デーモン化の。

自分自身をデーモン化する方法を知らないプログラムを(適切に)デーモン化するプログラムdaemonizeがあります。それは、それ自体をデーモン化するはずだったプログラムの欠陥を回避するために書かれましたが、適切に仕事をしませんでした。必要に応じて私に連絡してください-私のプロフィールを参照してください。

72

デーモンになる

このリンクには、プロセスがデーモンになるために実行する必要がある手順の良いリストがあります。

https://web.archive.org/web/20120328110436/http://www.steve.org.uk/Reference/Unix/faq_2.html#SEC16

著作権のためにリストを逐語的にコピーすることはできませんが(概要セクションを参照)、以下に要約を示します。

  1. fork(初回)-したがって、私たちはグループリーダーではなく、親を終了させます。
  2. setsid()を呼び出して、新しいセッションのリーダーになります。この呼び出しは、グループリーダーでない場合にのみ機能します。この新しいセッションには制御端末がありません。
  3. fork(2回目)-したがって、セッションリーダーではないため(制御端末を取り戻すことはできません)、親を終了させます。
  4. ルートディレクトリへのcd-したがって、他のディレクトリがアンマウントされるのを防止しません。
  5. umaskを目的の値に設定します(オプション)-不要なマスクを継承できたためです。
  6. stdin、stdout、stderrを閉じます(または、他の場所を指すように再度開きます)

Nohup

Nohupの機能:

  • Stdoutとstderrが端末に接続されている場合、それらをNohup.outにリダイレクトします
  • sIGHUPを無視します

類似点と相違点

唯一の一般的なアクションがstdoutとstderrのリダイレクトであることに注意してください。デーモンになるには、SIGHUPを無視する必要さえありません。

Nohupでは、プロセスのバックグラウンドに '&'を使用する必要はありません。つまり、ctrl-cを使用してSIGINTを送信できます。プロセスは引き続きキーボード入力に応答します。また、stdinは自動的に変更されないため、「< /dev/null」を使用して自分で変更することをお勧めします。

Nohupと通常使用される他の機能(バックグラウンドなど)を混同しないでください。 OPはNohupについて具体的に尋ねました。

実際に

実用性の観点から、シェルの終了時に継続する1回限りの長時間実行プロセスを開始する場合は、Nohupを使用しますが、バックグラウンド処理と組み合わせることもできます。およびstdinのリダイレクト。ワンタイムジョブはデーモンを作成する価値はありませんが、デーモンのプロパティの一部は、「cd /」などのNohupジョブで引き続き有用です。

定期的なスケジュールの定期的なタスクは、cron(または他のスケジューラー)を介して実行するのが最適です。

デーモンは、予測可能な開始時間がない繰り返しタスクを監視するのに最適です。通常、デーモンプロセスには明確な終了時間はありません(ユーザー/別のプロセスまたはシステムのシャットダウンによって明示的に停止されます)。多くの場合、デーモンは、アプリケーション(クライアント)または他の条件(たとえば、IO unix select()を介したデバイス経由の着信データ)に応答するサービスです。他のデーモンは、条件をポーリングし、応答。

端末の制御に関する補遺

このページ を参照してください。要約すると、制御端末はそのstdin、stdout、stderrへの無制限のアクセスを許可します。 1つのプロセスグループのみがstdinにアクセスできます。デフォルトでは、バックグラウンドプロセスグループはstdoutおよびstderrに書き込むこともできます。

また、端末に送信されるキーボード信号は、それを制御端末として持つプロセスグループにのみ送信されるようです。

42
Kelvin

UNIXバリアントでは、プロセスは端末プロセス(ログインシェル)に関連付けられます。したがって、端末プロセスが終了すると、この関連付けのためにプロセスも停止します。 Nohupは、端末が停止したときにプロセスが終了するのを防ぎます。

デーモンまたはデーモンは、起動時にシステムによって開始され、シャットダウンするまで実行されるプロセスであり、ユーザーが明示的に要求することはありません。そのため、定義上、ユーザーインタラクションの一部ではなく、システムに属します。

ユーザーとしてシステムにアクセスできる場合は、Nohupを使用できます。 sysadminの場合、デーモンプロセスをインストールできます。プロセスにとっては重要ではありません。

8