4

私はnginxが常に稼働していることを確認することについてかなり混乱しています。私の理解では、init.dスクリプトはnginxを開始および停止するだけです。これは正しいです?次に、ドキュメントでは、daemon=offを維持するように指示されています。

ここで、runitを使用したいと思います。以下は、runit実行スクリプトです。

#!/bin/sh
exec /etc/init.d/nginx start

新しいPIDが常に作成されていることに気付きました。

つまり、1)nginxファイルにこのステートメントがありません:

daemon = off;

2)上記のrunitスクリプトを使用していますが、常に新しいPIDが作成されます。

だから...nginxが常に実行されていることを確認するためのベストプラクティスは何ですか。

ちなみに私はmonitを使用していますが、hteデーモンを所有するためにrunitを使用します。

テストとして、killall -9 nginxを使用してnginxを強制終了し、psaux|を実行しました。grepnginxと私が新しいpidを取得したことに気づきました。だから..私はまだrunitが必要ですか?

4

2 に答える 2

6

下のスクリプト/etc/init.dはsysvinitに関連付けられています。これは、UNIXサービス管理に対する由緒ある、残念ながらかなり壊れたアプローチです。UNIXでのプロセスはツリーを形成します。すべてのプロセスには、それを開始したプロセスである親があります。親は子を細かく制御でき、重要なことに、子プロセスが終了したときに通知されます。プロセスを実行し続けるか、親である場合はシャットダウンするのは事実上簡単です。

そして、問題があります。sysvinitサービススクリプトは、サービスを開始してから終了し、サービスを実行したままにします。サービスの親プロセスがなくなったため、サービスを見つけて追跡することが困難になります。sysvinitスクリプトがサービスを停止するように求められた場合、信頼できない情報を使用して、どのプロセスを停止する必要があるかを判断する必要があります。

runitやdaemontoolsで使用されているように、正しいサービス管理アプローチでは、サービスは監視プロセスによって実行されます。このプロセスは、サービスの起動後に存続ます。サービスは子プロセスであるため、スーパーバイザープロセスは、サービスが実行されているかどうか、クラッシュしているかどうか、およびシグナルを送信するための場所を認識しています。

したがって、runitスクリプトでは、init.dスクリプトではなく、nginx自体を実行するのが正しい方法です。これは簡単に行えます。ただし、デフォルトでは、nginxはそれ自体をデーモン化します。つまり、nginxは親プロセスから意図的に「エスケープ」し、追跡が非常に困難になります。幸い、その動作はオフに切り替えることができます。これがdaemon off;構成オプションの目的です。したがって、nginxの有効なrunitスクリプトは次のようになります。

#!/bin/sh
exec /usr/sbin/nginx -g "daemon off;"

短くて甘い。runitはこの配置を非常にうまく管理できます-nginxを実行し続け、で制御できますsv。たとえば、sv hup nginxnginxに構成を再読み込みするように指示します。もちろん、nginxがクラッシュして再起動した場合、または意図的にで再起動するように要求した場合、PIDは変更されますsv restart nginxが、runitはそれを問題なく処理します。

(ちなみに、これまでに使用することはありません。kill -9

于 2016-10-24T04:00:29.627 に答える
-3

Nginxには、ワーカープロセスを管理するマスタープロセスがあります。それはそれ自身を動かし続けます。nginxをフォアグラウンドで実行し、他のアプリケーションに管理させることは、車輪の再発明では不十分です。

于 2012-03-06T00:24:55.093 に答える