#!/usr/bin/env ruby # # A simple example showing how to use Einhorn's shared-socket # features. Einhorn translates the (addr:port[,flags...]) bind spec in # into a file descriptor number in the EINHORN_FD_# environment # variables. # # Invoke through Einhorn as # # einhorn -b 127.0.0.1:2345,r ./time_server # # or, if you want to try out preloading: # # einhorn -b 127.0.0.1:2345,r -p ./time_server ./time_server require "rubygems" require "einhorn/worker" def log(msg) puts "=== [#{$$}] #{msg}" end def einhorn_main log "Called with ENV['EINHORN_FD_0']: #{ENV["EINHORN_FD_0"]}" fd_num = Einhorn::Worker.socket! socket = Socket.for_fd(fd_num) sleep_before_shutdown = 0 sleep_before_ack = 0 # Came up successfully, so let's set up graceful handler and ACK the # master. Einhorn::Worker.graceful_shutdown do if sleep_before_shutdown > 0 log "sleeping #{sleep_before_shutdown}s before shutdown" sleep sleep_before_shutdown end log "Goodbye!" exit(0) end if sleep_before_ack > 0 log "sleeping #{sleep_before_ack}s before ack" sleep sleep_before_ack end log "worker ack" Einhorn::Worker.ack! # Real work happens here. begin loop do accepted, _ = socket.accept accepted.write("[#{$$}] The current time is: #{Time.now}!\n") accepted.close end rescue Interrupt end end if $0 == __FILE__ einhorn_main end