システム管理者の観点から、UNIXベースのシステムにサービスを展開する際の実質的な違いは何ですか?
答え1
デーモンの場合、欲しいものは何にも縛られないプロセスです。少なくとも端末に接続されておらず、自分のセッションにあり、何も開いていない親から継承されたファイル記述子がなく、現在のディレクトリを所有する親(initを除く)がユーザーの世話をしたくありません/
。除去を防ぐ...
端末から切り離すには、新しいセッションを作成する必要があります。ただし、セッションを作成するためにグループ(またはセッション)リーダーにすることはできないため、新しいプロセスをフォークすることをお勧めします。親プロセスが終了すると仮定すると、これはそのプロセスに親プロセスがなくなり、initによって採用されることを意味します。次に、可能なすべてのファイル記述子を閉じますchdir("/")
(閉じることはできません)。閉鎖現在の作業ディレクトリは、ファイル記述子と同様にリソースを解放し、/
少なくとも現在の作業ディレクトリがディレクトリのアンロードを妨げないようにします。
このプロセスはセッションリーダーであるため、端末装置を開くと、その端末の制御プロセスになる危険があります。 2番目のフォークは、これが起こらないことを保証します。
一方、インタラクティブシェルは新しいプロセスグループを分岐して作成します(ターミナルのフォアグラウンドプロセスグループに属さないように)。非対話型シェルではプロセスを分岐し、その中の SIGINT を無視します。端末から切り離されず、ファイル記述子を閉じません(一部のシェルは標準入力を再び開きますが/dev/null
)...
答え2
伝統的なデーモンのアプローチは次のとおりです。
fork()
setsid()
close(0) /* and /dev/null as fd 0, 1 and 2 */
close(1)
close(2)
fork()
これにより、プロセスは端末と同じプロセスグループになくなり、端末と一緒に終了しなくなります。 IOリダイレクトは、出力が端末に表示されるのを防ぐことです。
答え3
プログラム/プロセスをデーモンとして実行することと、&記号を使用してバックグラウンドにフォークすることの違いは、基本的に所有権に関するものです。
最も一般的には、デーモンの親プロセスは次のとおりです。内部にプロセス(Unixシステムで開始された最初のプロセス)では、デーモンはそのプロセスの子です。つまり、権限のないユーザーとして直接制御することはできません。一方、プログラム/プロセスをバックグラウンドに分岐することは、いつでもこれをフォアグラウンドで呼び出すことも終了することもできます。
答え4
親プロセスが終了すると、SIGHUP 信号によってプロセスがcommand &
終了します。
プログラムが「デーモンモード」を明示的にサポートしていない場合(つまり、HUP信号を無視する場合)、システム管理者はまだいくつかの回避策にアクセスできます。
Bashシステムでは、次のものを使用できます。
(trap '' HUP; command) &
その後、サブシェルが開き、空のHUP
ハンドラで信号をキャプチャしてアンパサンド/フォークします。
出力はまだ間違った出力にリダイレクトされる可能性がありますtty
。または迷子になったり。またはを使用して問題を解決
できます。&>command.out
1>output.out
2>errors.out
ほとんどのシステムでは、このコマンドにアクセスすることもできますnohup
。
nohup
このプロセスは大幅に簡素化されました。これはかなり標準的ですが、多くのビジボックス内蔵ARMディストリビューションではこの機能がありません。次のように書くだけです。
nohup command &
..終わりました。出力はIIRCにリダイレクトされますが、nohup.out
このファイル名はオプションを使用して変更できます。