下のスクリプト/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)