Skip to content

Instantly share code, notes, and snippets.

@mignev
Last active December 31, 2015 07:09
Show Gist options
  • Save mignev/7952334 to your computer and use it in GitHub Desktop.
Save mignev/7952334 to your computer and use it in GitHub Desktop.
Fast rails runner
require 'socket'
# thanks to @mitio
UNIXSocket.open('/tmp/fast.pid') do |fastrails|
fastrails.write ARGV.join(' ')
puts fastrails.read
end
#!/usr/bin/env fast-rails
code ...
#!/bin/bash
# This file is located at /usr/bin/
exec scl-exec-ruby ruby /root/socket/client.rb "$@"
#!/bin/bash
# scl <action> <collection1>...<collectionN> <command> doesn't handle multiple params for command.
# If it did we would use: exec scl enable ruby193 "$@"
# This file is located at /usr/bin/
COMMAND="$(printf "%q " "$@")"
exec scl enable ruby193 "$COMMAND"
require 'socket'
require 'stringio'
require "/var/www/approot/railsapp/config/environment"
server_pid = "/tmp/fast.pid"
File.delete(server_pid) if File.exist?(server_pid)
server = UNIXServer.new(server_pid)
puts "Fast Rails runner is started!"
loop do
client = server.accept
client_arguments = client.recv(1024)
splited_client_aruments = client_arguments.split(' ')
command = splited_client_aruments.slice!(0)
arguments = splited_client_aruments
fork do
arguments.each do |argument|
ARGV << argument
end
begin
$stdout = StringIO.new
# thanks to @mitio
load(command)
client.puts($stdout.string)
rescue SystemExit
client.puts($stdout.string)
rescue Exception
client.puts( $!, $@ )
end
end
trap "CLD" do
pid = Process.wait
puts "Child pid #{pid}: terminated"
end
client.close
end
@mitio
Copy link

mitio commented Dec 13, 2013

Този сбит вариант на client.rb сам си затваря файла, няма нужда от останалите неща:

UNIXSocket.open('/tmp/fast.pid') do |fastrails|
  fastrails.write ARGV.join(' ')
  puts fastrails.read
end

Какво е scl?

@mitio
Copy link

mitio commented Dec 13, 2013

Защо ти е да правиш eval_script по този начин? Kernel.load не върши ли работа?

@mignev
Copy link
Author

mignev commented Dec 14, 2013

Здрасти,
мерси за насоките! Направих client.rb както ти предложи. Много по-красиво и по-чисто е така! Мерси :)

Относно Kernel.load, не съм го използвал, защото съм глупав! Работи си екстра :)) Мерси и за това.

Относно scl това е един тул на Red Had, на който истинското му име мисля е Software Collections, което в този конкретен случай се използва като алтернатива на RVM.

Хубавото при него е, че работи и за други езици по същия начин. Тоест можеш да подкарваш различни версии на NodeJS, Python и тнт.

Също има разни благинки от сорта:

[root@installer ~]# scl enable ruby193 bash
[root@installer ~]# ruby -v
ruby 1.9.3p448 (2013-06-27) [x86_64-linux]
[root@installer ~]# exit
exit
[root@installer ~]# ruby -v
ruby 2.0.0p247 (2013-06-27)  [x86_64-linux]

Ето това е за NodeJS например:

[root@small-1 ~]# node -v
v0.6.20
[root@small-1 ~]# scl enable nodejs010 bash
[root@small-1 ~]# node -v
v0.10.5
[root@small-1 ~]# exit
exit
[root@small-1 ~]# node -v
v0.6.20

@skanev
Copy link

skanev commented Dec 16, 2013

Хардкоднатия път към приложението е греда. Още повече, какво прави development проекта във /var/www? Това ми мяза на някакви PHP навици, и то лоши.

trap-а защо е в в loop-а? Не върши ли работа ако го сложиш извън?

Иначе, яко. Ако ти се вдига level, може да разгледаш drb за да не се занимаваш със сокети като грешен дявол.

@mignev
Copy link
Author

mignev commented Jan 7, 2014

Хардкоднатия път е защото ми трябва да си реша проблема само с 1 проект :), не съм го планирал за повевече от един прокет :)

Намира се във /var/www приложението е измислено да работи там поради някаква причина ?!? Трябва да питам RedHat защот така са го решили :))

Относно trap-a ... не мисля, че мога да ти дам разумент отговор ... мисля, че имаше някаква причина .... но не съм сигурен в момента!

Относно drb мерси :) ще го погледна, изглежда наистина интересно.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment