(以下では、「という用語をよく使用します。デーモンまたはワーカー「下記の文脈で、私はそれらの単語の間の正確な違いを知らないので、どの単語を使うべきかわからないことを示すために。)
次のシナリオを考えてみましょう。
- 特定のポートでリッスンし、そのポートからの要求を受け入れ、新しいポートをフォークするサーバーを作成する必要があります。デーモンまたはワーカーすべての着信要求に対処します。
- 所定の金額を開始するサーバーを作成する必要があります。デーモンまたはワーカー次に、特定のポートでリッスンし、最後にそのポートからの着信要求を現在使用可能なポートの1つに割り当てます。デーモンまたはワーカー。この方法は、所定の数のデーモンまたはワーカーただ要求を受け取るときに多数の要求が発生するのを防ぐためのものです。これはおそらく最初のケースです。
私はLinuxでこれを行うためにPythonを使用しています。私は2つの生成方法を見つけました。デーモンまたはワーカー:
使用して
multiprocessing.Process
そしてそれを設定daemon
到着するTrue
。これを試してps
コマンド出力でデーモンやワーカーを観察したときに気づきました。デーモンまたはワーカーなしPPID=1
(initd
Linuxのプロセス)ですが、サーバーのPPID
PID(ここ)に設定されています。28822
このアプローチもデーモンとウォーカー誤った状態では、ps
コマンド出力から自動的に削除されません。明示的にそれらを殺す必要があります。$ ps axo pid,ppid,pgid,sess,comm --forest | grep -E 'python| PID' PID PPID PGID SESS COMMAND 28822 25898 28822 25898 | \_ python3 28823 28822 28822 25898 | | \_ python3 <defunct> 28828 28822 28822 25898 | | \_ python3 <defunct> 28831 28822 28822 25898 | | \_ python3 <defunct>
ところでダブルフォークを使ってみると
os.fork()
1、2そして扱うsingnal.SIGCHLD
、死んだプロセスを残すことなく、これらのデーモンにPPID 1を正しく割り当てます。たとえば、ps
次のコマンドの出力に従います。$ ps axo pid,ppid,pgid,sess,comm --forest | grep -E 'python| PID' PID PPID PGID SESS COMMAND 43680 43300 43680 43300 | \_ python3 43683 1 43682 43682 python3 43690 1 43689 43689 python3 43699 1 43698 43698 python3
PIDが{43683、43690、43699}の3つのPythonプロセスは次のとおりです。デーモンまたはワーカー、
PPID=1
完全に実行すると、コマンド出力から消えます。
疑い
PPID=1
私はデュアルフォークによって生成されたプロセスが真のUnixデーモンであると信じています。また注意事項マルチプロセッシング文書は次のとおりです。:また、これらはUnixデーモンやサービスではなく通常のプロセスなので、デーモン以外のプロセスが終了すると終了します(結合されていません)。
したがって、デュアルフォークで作成されたプロセスは実際のLinuxデーモンですが、マルチプロセッシングライブラリで作成されたプロセスはライブラリでデーモンと呼ばれても作業者に過ぎません。
私は正しいですか?
上記のシナリオでどのような方法が適切かを知りたいです。シナリオ1はマルチプロセッシングアプローチでよりよく実装されなければならず、シナリオ2はデュアルフォークアプローチでよりよく実装されるべきだと思います。
私は正しいですか?
答え1
技術的には、新しいセッションを開始し、リーダーになり、制御ttyから切り離すためにフォークの後にデーモンを呼び出す必要がありますが、setsid()
はい、そうです。
実際、両方のケースで両方を実行したいと思います。まず、デーモン化を実行すると、デーモンはより多くのワーカーを作成できます。