0

EventMachine.connect_unix_domainThin as a service (init スクリプト (抜粋) と以下の構成を使用) を実行しているときに使用するにはどうすればよいですか。直下のコードが問題です (eventmachine not initialized: evma_connect_to_unix_serverエラーが発生します)。2 番目のコード例は機能しますが、シンをデーモン化することはできません (私は思いません)。Thin には EventMachine の実行中のインスタンスがまだありませんか?

更新: 奇妙なことに、(でservice thin stop) サーバーを停止すると、config.ru ファイルに入り、アプリを実行するようです (したがって、stopコマンドがタイムアウトしてプロセスを強制終了するまで機能します)。この動作を引き起こしている可能性のある薄い停止が発生するとどうなりますか?

問題のあるコード

class Server < Sinatra::Base
# Webserver code removed
end

module Handler
  def receive_data data
    $received_data_changed = 1
    $received_data = data
  end
end

$sock = EventMachine.connect_unix_domain("/tmp/mysock.sock", Handler)

作業コード

EventMachine.run do
  class Server < Sinatra::Base
  # Webserver code removed
  end

  module Handler
    def receive_data data
      $received_data_changed = 1
      $received_data = data
    end
  end
  $sock = EventMachine.connect_unix_domain("/tmp/mysock.sock", Handler)
  Server.run!(:port => 4567)
end

初期化スクリプトの抜粋

DAEMON=/usr/local/bin/thin
SCRIPT_NAME=/etc/init.d/thin
CONFIG_PATH=/etc/thin

# Exit if the package is not installed
[ -x "$DAEMON" ] || exit 0

case "$1" in
  start)
    $DAEMON start --all $CONFIG_PATH
    ;;

シン構成

--- 
chdir: /var/www
environment: development
timeout: 30
log: log/thin.log
pid: tmp/pids/thin.pid
max_conns: 1024
max_persistent_conns: 512
require: []

wait: 30
servers: 1
socket: /tmp/thin.server.sock
daemonize: true
4

2 に答える 2

0

私がやったのは、 を削除しEventMachine.run do ... end、ソケット接続を で囲むだけでしたEM.next_tick{ $sock = EventMachine.connect_unix_domain("/tmp/mysock.sock", Handler) }

私はこれを以前に一度試したことを誓うことができます...しかし、今はうまくいきます。

編集: のアイデアはherenext_tickから来ました。

于 2011-07-12T18:31:55.220 に答える
0

Thin は EventMachine の上に構築されます。アプリの提供には EventMachine を使用する必要があると思います。Thinがデーモン化しない方法でさらにデバッグしてみてください。(使用しているバージョンは何ですか?)。また、4000 などの別のポートで Thin を実行し、それをアップストリーム サーバーとしてプロキシ転送サーバーに渡すこともできます。

于 2011-07-09T16:44:47.227 に答える