バックグラウンドプロセスが何であるかをよりよく理解したいと思います。このコード行を読んだ後、次のような質問があります。
/usr/sbin/rsyslogd -niNONE &
文書は次のように言います。
-i pid file Specify an alternative pid file instead of the default one. This option must be used if multiple instances of rsyslogd should run on a single machine. To disable writing a pid file, use the reserved name "NONE" (all upper case!), so "-iNONE". -n Avoid auto-backgrounding. This is needed especially if the rsyslogd is started and controlled by init(8).
アンパサンドは、&
コマンドがバックグラウンドで実行されるように要求することを意味するようです。ここ。
私の理解が正しいなら、pidファイルデーモンと共に使用つまり、プログラムがバックグラウンドで実行されているときです。
したがって、問題のコマンドは、最初にプログラムがバックグラウンドで実行されないように指示し、次にpidファイルにNONEを指定してデーモン1-n
ではないことを示します。背景。&
私はこれを理解できません。プロセスが通常、別のコンテキストを使用して入力するコンテキストがに送信されますか&
?私が読んだすべてのものから背景の後ろに隠れた唯一の意味は、シェルがブロックされていないことです。この点で、プロセスが自動的に背景を設定せずに背景を設定するように要求することは意味がありません。
ここで何か抜けましたか?具体的な背景は何ですか? (この時点でpidファイルを削除する責任は誰にありますか?)
1 - 問題のあるDockerコンテナのコンテキストにpidファイルがあると、コンテナが停止して再起動したときに問題が発生する可能性があります。 pidファイルを削除する原因が何であるかは不明であり、一部の情報源は次のように提案しています。systemdなどのシステム初期化、他の人はプログラムの責任であることを意味します。。ただし、SIGKILLを使用してプロセスを終了すると、プログラムはプロセスを削除する機会がない可能性があるため、pidファイルはすでに存在するが存在するとは予想されないため、後続のコンテナの再起動は失敗します。
答え1
UNIXバックグラウンドプロセスの概念は、ジョブ制御の一部です。ジョブ制御は、端末セッションプロセスを中心に構成されます。
デーモンは通常ターミナルセッション内で実行されないため、Unixジョブ制御の観点からバックグラウンドプロセスではなく、システムの一部である「見えない」アクティビティという一般的なコンピューティングの観点からはそうです。これはrsyslogd
文書で言及されている内容である可能性が高いです。これは、ジョブ制御デーモンではなくデーモンプロセスになることを意味します。
対話型端末セッションでのユーザー管理働く。各働く一部のソフトウェア(通常はジョブ制御シェル)によってグループとして予約されているプロセスグループ(おそらく1つ)です。セッションの各タスクには端末があります。制御端子。
バックエンド/フロントエンドの概念は、これらのタスク間のエンドデバイスの共有に関連しています。いつでもプロセスグループの1つがフォアグラウンドプロセスグループとして指定されます。端末から文字を読み取り、出力を端末に送信できます。他のプロセスグループはバックグラウンドプロセスグループです。
タスク制御シェルは、TTYの信号を特定の機能(例えばtcsetpgrp
。
フォアグラウンドプロセスグループは、端末で読み書きできるだけでなく、TTYによって生成された信号(例:SIGINT
からおよびCtrlCからSIGTSTP
)も受信できますCtrlZ。
通常、ジョブCtrlZをバックグラウンドで中断し、ジョブ制御コマンドを使用してbg
バックグラウンドで実行するようにします。
を実行すると、CtrlZフォアグラウンドプロセスグループ内のすべてのプロセスがシグナルをSIGTSTP
受信して一時停止します。ジョブ制御シェルはこの変更を検出し、ライブラリ呼び出しを介してジョブをバックグラウンドに移動し、それ自体フォアグラウンドプロセスグループ。したがって、シェルは再び前景にあり、TTYからコマンドを受け取ることができます。
今入場できます背景、シェルはバックグラウンドジョブの実行を一時停止します。
これパグコマンドを実行すると、シェルは前景から自分自身を削除し、バックグラウンドタスクを前景に戻します。
バックグラウンドジョブは、TTY(例:SIGINT
から)から文字ベースの信号を受信しませんCtrlC。ただし、端末で読み書きを試みると、同様の信号が受信され、対応するSIGTTOU
操作がブロックされます。
職務管理は、ターミナルへのアクセスを保護する交通警察と同じです。
GUIのウィンドウ管理に似ています。一般的なGUIでは、ウィンドウには「キーボードフォーカス」があります。キーを押すと、このようなウィンドウが表示されます。ジョブ制御も同様です。フォアグラウンドプロセスグループには、「ターミナルフォーカス」があります。
ドキュメントrsyslogd
では、実際には「デーモンになる」または「デーモン化する」を意味するために「バックグラウンド」という用語を使用することはほぼ確実です。これは、POSIX ジョブ制御の「バックグラウンドジョブ」とは異なります。
サーバーアプリケーションが自動的にデーモン化されると、これは、ターミナルセッションで実行されている場合は、そのセッションから自分自身を削除するためのアクションを取ることを意味します。子と孫をフォークします。子プロセスが終了するので、孫は孤児となりinit
デーモンの子になります。これはその一部です。別の部分は、Sun Tzu が標準入力、出力、およびエラーファイル記述子を閉じることです。そのため、TTYとの接続が切断されます。特定の作業ディレクトリに変更するなど、他の作業も実行できます。
rsyslogd
によって実行されると、それ自体はデーモン化されません。これはinit
、分離する端末セッションがないため意味があります。 (ただし、rsyslogd
端末セッションの一部ではないと検出される可能性があり、この場合フラグは不要です-n
。)
したがって、サーバー上のdo-not-daemonizeコマンドラインオプションの主な用途は、次の理由でデバッグ用です。
おそらく、デーモンにデバッグトレースモードがあり、メッセージが標準出力に送信される可能性があります。コンソールでこれらのメッセージを表示するには、デーモンが標準出力ファイル記述子を閉じたくありません。
デバッガでデーモンをデバッグしたい場合は、ただ終了すると、実際のデーモン活動が分岐した孫から発生するため、不便です。
CtrlCテスト時に使用してデーモンを終了したり、を使用して一時停止するなど、デーモンにジョブ制御を適用できますCtrlZ。
時々、人々はサーバーがターミナルセッションで実行されているターミナル多重化ソフトウェア(GNU ScreenやTermuxなど)でサーバーを実行したいと思うかもしれません。自動デーモンは自分の目的を崩します。
PIDファイルを削除する責任がある人:主にサービスアプリケーション自体(完全に終了した場合)。一部のマスタープロセスがサービスを管理している場合は、PIDファイルのパスを知り、ファイルを削除せずに終了したらクリーンアップできます。 PIDファイルは通常、再起動時に消去されるディレクトリに配置されます。したがって、たとえば/var/run
システムに重大なエラーが発生したために再起動が必要な場合、再起動時にPIDファイルが処理されます。