/etc/init.dでサービスを設定しています。そこから様々なスクリプトを見ているが、いくつかstart-stop-daemon ...
は/path/to/script &
。
どちらもpidをファイルに保存し、いくつかのチェックを行います。
ベストプラクティスは何であり、違いは何であり、ここで何を知る必要がありますか? (一般的に言えば)
私の特別なケースでは、アプリケーションが1時間に1回呼び出すJavaの単純な軽量ローカルホストhttpサーバーがあります。ここに詳細はありません。ファイルシステムやスレッドなどを使用しないという意味です。私の質問に備えて複雑です)
ありがとう
ベストアンサー1
バックグラウンドジョブ(つまり、&で始まるジョブ)のstdin、stdout、およびstderrは、そのジョブが開始された端末にまだ接続されています。突然、端末に(エラーメッセージなど)書き込むか(フォアグラウンドの操作を「妨げる」)、キーボード入力を待っている間に一時停止することがあります(最初にフォアグラウンドにインポートする必要があります)。もちろん、stdoutとstderrをファイルまたは/ dev / nullにリダイレクトして、バックグラウンドジョブが端末に書き込まれないようにすることもできます。
バックグラウンドジョブを前景に配置することもできます。現在のフォアグラウンドジョブが停止しfg
(フォアグラウンド)コマンドを使用して、バックグラウンドジョブをフォアグラウンドにインポートします。バックグラウンド動作は、端末の信号を介して実施することもできる。 SIGHUP は通常、端末を閉じると、端末で開始された (ほとんどの) プログラムを終了します。
一方、デーモン(たとえば、init.dによって自動的に起動されますが、端末から手動で起動することもできます)は、端末との接続が切断された状態で実行されます。ターミナルから手動で起動しても、デーモンはターミナルとの接続が切れて書き込み(stdout、stderr)も、読み込み(stdin)もできません。また、端末から「自動的に」送信された信号に「免疫」されます。 (ただし、を使って信号を送ることはできますkill -signal pid
。)
「バックグラウンド」と「フォアグラウンド」は、現在の端末を制御するプロセスであるかどうかにかかわらず、端末のプロセス状態を示します。デーモンが端末に接続されていないため(ただし、さまざまな方法で端末と自動的に切断されたため)、バックグラウンドで実行されているとは言えません。デーモンは、フォアグラウンドであれバックグラウンドであれ、ターミナルに接続されずに実行される単純なプロセスです。
プロセスが使用する端末を表示するオプションを使用すると、ps
フォアグラウンドタスクとバックグラウンドタスクの両方が端末(tty2など)に関連付けられていることがわかります。一方、デーモンはこのフィールドに「?」を持ちます。
デーモンは手動で起動しても通常これを行います。自分だけのデーモンを作るのはかなり大変な作業です。ターミナルからデーモンを完全に切断するには、いくつかのヒントが必要です。これを実行するには、独自のユーザー/グループを作成する必要があります。ファイルを生成するには、通常/tmp、/var/tmp、または/var/runを使用する必要があります。通常、他の場所では権限がないはずです。端末にエラーを報告できないため、エラーをログファイル(たとえば/ var / logにある独自のログファイル)に書き込む必要があります。デーモンは現在PIDを使用して/ var / runにエントリを作成し、そのエントリの他のインスタンスがすでに実行されていることを確認する必要があります。該当する場合は、ファイルまたはデバイスのロック(/var/lock)に準拠する必要があります。構成ファイルを再ロードし、更新された構成を使用してSIGHUPに応答する必要があります。
もう一つのポイントは、ほとんどのデーモンが動作する方法です。デーモンは通常、元のデーモン(親プロセス)が起動時に起動されたのか手動で起動されたのか、その親プロセスの子プロセスによって生成されたかに応じて、2つのモードのいずれかで実行できる単一の実行可能ファイルです。親プロセスは通常、特定の時間、経過時間、特定のネットワークポートへの接続試行、またはその他のイベントなど、いくつかのイベントを待ちます。これが発生すると、親プロセスは自分と同じ子プロセスを作成し(fork()システムコールを使用して)、すぐに戻って別のイベントを待ちます(そしてより多くの子プロセスを生成することもできます)。ディスクの同期、コマンドの実行(例cron
)、ネットワーク接続の設定(sshd
またはftpd
)などの操作を実際に実行する子プロセス。親プロセスと子プロセスの唯一の違いは、異なるPIDを持つことです。子プロセスのPPID(Parent-PID)は親プロセスのPIDです。これは、プロセスが親プロセスか子プロセスかを確認するために使用できます。 。したがって、同じプロセスは、スタンバイ(および作成)親プロセスまたはワーカーサブプロセスの2つのモードで実行できる必要があります。
デーモンを書くことは難しくありませんが、些細なことではありません。ご覧のとおり、まず知っておくべき「トリック」がたくさんあります。一般に、デーモンを書くには、他の選択肢に比べてほとんど利得のない努力が必要だと思います。
あるいは、バックグラウンドタスクを使用することは、通常、nohup
端末が閉じてもプロセスをアクティブに保つため、十分な選択です。disown
ただし、通常はstdoutとstderrをファイルまたは/dev/nullにリダイレクトすることをお勧めします。より多くのインタラクティブプログラムの場合は、screen
必要になるまで「邪魔になる」項目を残すことをお勧めします。 at
、batch
またcrontab
考慮する価値があります。