4

私は常にbluepillを使用して単純な Ruby スクリプトをデーモン化してきました。ただし今回は、Rails 環境もロードするスクリプトがあるので、Rails アプリとそれぞれのモデルのデータベース接続にアクセスできます。私が使用する bluepill 構成は、私が通常行っているものと何ら変わりはありません。

   Bluepill.application("myapp", :foreground => true, :log_file => "/tmp/bluepill.log") do |app|
          app.process("myapp_process") do |process|
            process.start_command = "/usr/local/rvm/rubies/ruby-1.9.3-p194/bin/ruby /media/apps/myapp/current/lib/async/myscript.rb"
            process.pid_file = "/media/apps/myapp/current/tmp/pids/myscript.pid"
            process.daemonize = true
            process.stdout = "/var/log/myapp/media.log"
            process.stderr = "/var/log/myapp/media_error.log"
            process.working_dir = "/tmp"
            process.stop_command = "kill -QUIT {{PID}}"
            process.start_grace_time = 15.seconds
          end
    end

主な問題は次のエラーです。

Failed to signal process 16096 with code 0: No such process

これを使用してRails環境をロードしない場合:

require File.expand_path("/media/apps/myapp/current/config/environment")

これは、私の他のスクリプトの束と同じように機能します。ただし、Rails 環境をロードするスクリプトをデーモン化しようとするのはこれが初めてです。ruby gem Daemons を使用してこれを機能させることができることはわかっていますが、それでは監視が行われず、bluepill は両方を非常にうまく行うことができます。

ここで明らかな何かが欠けていますか?

4

4 に答える 4

4

killデーモンがシグナルを受信できるかどうかを判別するための照会には、シグナル・コード 0 を指定します。Bluepill ソースは、デーモン プロセスが正常に動作しているかどうかを確認するために、スポーン後に頻繁に実行されることを示しています。

プロセスが存在しないため、環境のロード中に ruby​​ が死んでいる可能性があります。

スクリプトを表示しませんでした。コマンドラインからは問題なく動作すると思いますが、デーモン化に失敗します。考えられる説明は、Bluepill プロセスに欠けているものがシェルの環境にあるということです。もう 1 つの可能性は、インタラクティブ シェルにはあるリソースへのアクセスですが、ヘッドレス デーモン プロセスにはありません。

ここに1つの推測があります:requireあなたが与えたが機能するためには、RAILS_ENV環境変数を設定する必要があると思います。あなたはそれをやっていますか?たとえば、このメモを参照してください。おそらく、ブート スクリプトを使用してロードする方がよいでしょう。たとえば、Rails の初期化の説明を参照してください。

于 2013-09-27T02:02:31.287 に答える
2

うーん。しばらく bluepill を試してみましたが、プロセスの起動が複雑な多くの場合、役に立ちませんでした。最近では、非常に役立つ多くの付属コンポーネント (たとえば、ユーザーや環境を設定するための chpset など) を持つ「runit」に満足しています。現在、chef などの DevOps ツールを使用して、標準サービスを備えたマシンをセットアップしていますが、runit の方が適していました。しかし、これらのいずれでも、監視システムからシグナルを受信できるようにするには、実行中のプロセスの pid が必要です。開始コマンドから取得する PID のように聞こえます。

/media/apps/myapp/current/lib/async/myscript.rb

実行中のスクリプトではありません。おそらく、そのスクリプトをさらに投稿すると、何が起こっているかがわかりますが、どこかで別のプロセスをフォークしていると思いますか?

于 2013-09-20T20:44:07.813 に答える
0

このサイトでhttps://github.com/arya/bluepill/issues/164この情報を見つけました

いくつかの実験の後、 --no-privileged フラグと base dir および logfile フラグを指定してコマンドを実行すると、それが機能することがわかりました。それらも構成に含まれているため、少し冗長です:/

コマンド例: bundle exec bluepill load bluepill/monitorbs.pill --no-privileged --base-dir /xxx/xxx/xxx --logfile /xxx/xxx/xxx/bluepill/bs.log"

于 2013-09-27T12:53:05.627 に答える