3

私はforemanを使用して、運用サーバー (ubuntu サーバー 12) で node.js アプリケーションを実行しています。Foreman には、upstart 用のスクリプトを作成するための優れたツールがあります。

問題は、サーバーを再起動すると、アプリケーション (フォアマンによって管理される) が redis-server の前に起動され、有効な接続を待機するためにいくつかのトリックを構築する必要があることです。

理想的な解決策は、redis-server を早期に開始し、すべての開始時にノード アプリケーションを開始することです。

ブート構成:

  • redis-server は /etc/init.d/redis-server によって起動され、/etc/rc2.d/S20redis-server です
  • 私のノードアプリケーションは /etc/init/stocks-streamer*.conf ファイルで開始されます

私の質問は: ノード アプリケーションの起動順序をどのように変更しますか? アプリケーションが起動する前に redis-server を待ちたいのですが、これを行っても起動しません:

start on (started redis-server)

init.dスクリプトからupstartにイベントが送信されないためだと思いますが、おそらく私が知らない方法がありますか?

よろしくお願いいたします。

4

2 に答える 2

1

アプリのすべての依存関係をより適切に制御できるように、代わりに職長が redis を起動する必要があるかもしれません。

または、職長が redis よりもかなり遅く開始するようにします (/etc/rc2.d の職長のリンクが S20* より後にリストされていることを確認してください)。

もう 1 つの代替手段: redis サーバーも upstart によって開始されます。これは、upstart が依存関係を管理するのに役立つ可能性があります。

これを行う方法については、 https ://gist.github.com/bdotdub/714533 に説明があります。

そして、代わりに「開始は別のサービスより前に開始する必要があります」( http://upstart.ubuntu.com/cookbook/#start-must-precede-another-service ) を使用して、独自のサービスを開始したときに redis が開始されるようにすることをお勧めします。

于 2013-02-25T10:00:56.590 に答える
0

この質問には受け入れられた回答がないため、ここで同じ問題が発生したため、別の解決策を提供すると考えました。質問は次のように言い換えることができます。

init.d スクリプトで upstart ジョブを待機させるにはどうすればよいですか?

OPが質問で述べているように、init.dスクリプトが開始されたときにupstartイベントを発行することができます。このようにして、upstart ジョブは単純なstart on started SCRIPT_NAME宣言を持つことができます。

私の場合、CentOS ベースのカスタム ディストリビューションを使用して/etc/rc.d/rc、sysvinit (init.d) スクリプトの実行を担当しています。そのスクリプトは完全に upstart を認識しているため、開始/停止された sysvinit スクリプトごとに upstart イベントを発行します。

つまり、/etc/rc.d/rcスクリプトには次のようなものがあります (ジューシーなものを残すために単純化されています)。

for i in /etc/rc$runlevel.d/S* ; do
    subsys=${i#/etc/rc$runlevel.d/S??}
    initctl emit --quiet starting JOB=$subsys
    $i start
    initctl emit --quiet started JOB=$subsys
done

スクリプトを見て、適切だと思われる場所にイベントの発行を追加する必要があると思います。私の場合、放出はすでにそこにありました。

upstart ジョブで複数のイベントを待機できます。利用可能なイベントを見つける方法については、この質問を参照してください(正直なところ、より良いドキュメントは見つかりませんでした)。

特に、トリック togrep -r emitは非常に便利なようです。

于 2017-02-16T22:08:56.143 に答える