start-stop-daemonと&で実行することの違いは何ですか?


18

/etc/init.dでサービスを設定しています。私はそこではさまざまなスクリプトで探しています、いくつかで実装されているstart-stop-daemon ...と、いくつか/path/to/script &

それらはすべて、pidをファイルに保存し、いくつかのチェックを行います。

ここで知っておくべき重要なことは何ですか?(一般に)

私の特定のケースでは、アプリケーションが1時間ごとに呼び出すJavaのシンプルな軽量ローカルホストhttpサーバーがあり、それは単に愚かな乱数を与えます(ここではこれ以上の詳細はありませんが、ファイルシステムを使用しないか、私の質問でこれが問題になる場合のスレッドまたは複雑なもの)

ありがとう

回答:


27

バックグラウンドジョブ(つまり&で始まる)には、それが開始された端末にまだ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に応答する必要があります。

もう1つのポイントは、ほとんどのデーモンがどのように機能するかです。デーモンは通常、2つの異なるモードのいずれかで実行できる単一の実行可能ファイルです。元のデーモン(親)が起動時または手動で起動されたか、またはこの親によって生成された子であるかによって異なります。親プロセスは通常、特定の時間、経過した時間、特定のネットワークポートへの接続試行など、何らかのイベントを待機して待機します。これが発生すると、親は(fork()システムコールを使用して)自身と同じ子プロセスを作成し、すぐに別のイベントの待機に戻ります(さらに子を生成する場合があります)。実際に作業を行うのは子プロセスです-ディスクの同期、コマンドの実行(例cron)またはネットワーク接続の確立(例:sshdまたはftpd)。親と子の唯一の違いは、それらが異なるPIDを取得し、子のPPID(親PID)が親プロセスのPIDであるということです-これは、プロセスが親か子かを抑止するために使用できます。したがって、同じプロセスは、待機(および生成)親として、または作業子として、2つのモードで動作できる必要があります。

デーモンを書くことは難しくありませんが、些細なことでもありません-あなたが見るように、あなたが最初に知っていなければならないかなりの「トリック」があります。一般的に、デーモンを書くことは、他の代替手段と比較して非常に小さな利益のために多くの努力を必要とすると思います:

バックグラウンドジョブを使用しnohupたりdisown、バックグラウンドジョブで使用したりすることは、通常、端末が閉じてもプロセスを存続させるのに十分な代替手段です。多くの場合、stdoutとstderrをファイルまたは/ dev / nullにリダイレクトすることをお勧めします。よりインタラクティブなプログラムの場合screenは、必要になるまで何かを「離れて」おくのに良い方法です。 atbatchまたcrontab検討する価値があります。


1
また、古いUnixシステムコースから、ターミナルから起動した場合、サーバーは[プロセスグループ] [ en.wikipedia.org/wiki/Process_group]からも離れなければならないことを覚えています。私が覚えている限りでは。そのため、プロセスは元の端末からの信号を一切受けません。
イヴボームズ13年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.