停止と再起動

动漫剧场时间:2024-04-27 17:36:34点击:9

を停止したり再起動したりするためには、実行されているプロセスにシグナルを送る必要があります。シグナルを送るには二つの方法があります。一つ目はプロセスに直接シグナルを送るunixのkillコマンドを使用する方法です。システムを見ればたくさんのが実行されているのに気が付くでしょうが、シグナルを送るのは親プロセスだけで、それ以外の個々のプロセスにはシグナルを送らないで下さい。その親プロセスのpidはに書かれています。これはつまり、親以外のプロセスにシグナルを送る必要すらない、ということです。親プロセスに送ることができる3種類のシグナルがあります:TERM,HUP,USR1です。これらの説明については続きをご覧下さい。

親プロセスにシグナルを送るには、次のようなコマンドを発行して下さい:

kill-TERM`cat/usr///logs/.pid`

プロセスにシグナルを送る2番目の方法は-kというコマンドライン引数を使用することです。下で説明されているように、stop,,を指定できます。これらはの引数ですが、制御用のスクリプトを使うことをお薦めします。はそれらの引数をそのままに渡します。

にシグナルを送った後、実行状況を次のコマンドで読むことができます:

tail-f/usr///logs/

ここに挙げた例は、各自のとの設定に適合するように適宜修正して下さい。

シグナル:-kstop

TERMあるいはstopシグナルを親プロセスに送ると、即座に子プロセス全てをkillしようとします。子プロセスを完全にkillし終わるまでに数秒かかるかもしれません。その後、親プロセス自身が終了します。処理中のリクエストは全て停止され、もはやリクエストに対する応答はされません。

シグナル:-k

親プロセスはUSR1あるいはシグナルを受け取ると、子プロセスに現在のリクエストの処理の後に終了する(あるいは何もしていなければすぐに終了する)ように助言します。親プロセスは設定ファイルを再読込して、ログファイルを開き直します。子プロセスが徐々になくなるに従って、新しい世代の設定による子プロセスに置き換えていきます。そして、これらが新たなリクエストに即座に応答し始めます。

特定のプラットホームではUSR1を緩やかな再起動のために使うことができませんが、代わりのシグナル(例えば)が使用できるでしょう。というコマンドはプラットホームに合ったシグナルを送ります。

このコードは常にMPMのプロセス制御ディレクティブの設定を重視しますので、クライアントのリクエストを扱うプロセスとスレッドの数を再起動の処理中も適切な値に維持されます。。また、次のようにしてを守ります:少なくとも1秒後に個の新しい子プロセスが生成されていなければ、その数になるように適宜プロセスを生成します。この挙動は現在の負荷に対して適切な子プロセスの数とパラメータでの希望の数の両方を維持しようとしています。

を使用している場合は、USR1シグナルが送られた際にサーバ統計がゼロに設定されないことに注意してください。サーバが新しいリクエストに応答不能な時間を最小にするように(リクエストはOSによってキューに追加されるので絶対に紛失はしません)、また同時に、希望のチューニングパラメータを守るようにコードは書かれています。このようにするために、世代をまたがった全子プロセスの追跡に使われているスコアボードを維持しなければなりません。

モジュールは、緩やかな再起動以前から開始してリクエストに応答し続けている子プロセスを特定するために、Gを使うこともします。

現在、USR1を使うログ移動スクリプトでは、再起動前の子プロセスがログを書き終わったことを確証する方法がありません。古いログに対して何かする前に、USR1シグナルを送った後いくらか適当な時間待つことを提案します。例えば、帯域の狭い通信路のユーザのリクエストのほとんどが10分以下で完了しているということが分かっていれば、古いログに何かする前に15分待つということです。

再起動時に設定ファイルに誤りがあると、親プロセスは再起動せずにエラーとともに終了します。緩やかな再起動の場合は、親プロセスが終了した後でも子プロセスが実行されたまま放置されたりもします。(最後のリクエストを処理した後「緩やかに終了」する子プロセスとなります。)サーバを再起動する際に、これが問題になるかもしれません--サーバはするポートにバインドできないかもしれません。再起動する前に、設定ファイルの構文を

-t

コマンドライン引数(

をご覧下さい)を使って検証することができます。設定ファイルの意味的な内容を構文と同様に検証したい場合は、非rootユーザで

を起動しようとすればわかります。もしエラーがなければ、ソケットやログを開こうとしてrootでないため(もしくは実行中の

が既に必要なポートにバインドしているため)に失敗するでしょう。これ以外の来由で起動に失敗したのであれば、それは設定ファイルのエラーで、緩やかな再起動を行う前にその誤りを修正しなければなりません。

シグナル:-k

HUPあるいはシグナルを親プロセスに送ると、TERMと同様に子プロセスをkillしますが、親プロセスは終了しません。設定ファイルを再読込して、ログファイル全てを開き直します。その後、新しい子プロセスを起動して応答を続けます。

を使っている場合は、HUPが送られた場合にサーバ統計がゼロに設定されることに注意してください。

再起動時に設定ファイルに誤りがあると、親プロセスは再起動せずにエラーとともに終了します。これを避けるには次の方法をご覧下さい。

1.2b9以前は、再起動や停止のシグナルを含む競合状態(競合状態を簡単に説明すると:タイミンにグよる問題で、具合の悪い時間帯にちょうど何かが起こると予想外の動作をするようなことを指します)がありました。「正しい」機能を持っているアーキテクチャでは、できるだけこのようなことが起こらないようにしています。しかし、ある種のアーキテクチャでは競合状態は未だ確実に起こりえるということに注意してください。

ディスク上でを使用しているアーキテクチャでは、潜在的にスコアボードが壊れる能够性があります。スコアボードが壊れた場合は、"bind:inuse"(HUP後)や"longlostcamehome!"(USR1後)といった結果になります。前者は致命的なエラーですが、後者はスコアボードスロットを失うだけです。ですから緩やかな再起動は、たまに確実な再起動(HUP)も併用して使った方が良いでしょう。これらの問題を克服するのは非常に難しいのですが、幸いなことに大部分のアーキテクチャではスコアボードのファイルは必要ありません。これを使用するアーキテクチャは、をご覧下さい。

全てのアーキテクチャにおいて、個々の子プロセスで継続的なHTTPコネクション()に関する小さな競合状態が起こりえます。リクエスト行を読んだ後、そしてリクエストヘッダを読む前に子プロセスは終了するかも知れません。これに対する修正がありますが1.2で修正するには発見が遅すぎました。理論的には、これは問題ではありません。なぜならのクライアントは、ネットワーク遅延やサーバのタイムアウトなどに備えていなければならないからです。実際にも何か影響があるようには見えません--テストケースでサーバを1秒間に20回再起動してもクライアントは壊れた画像や空のドキュメントを受け取ることなく正常に閲覧できています。

推荐内容