-
-
Save mignev/7952334 to your computer and use it in GitHub Desktop.
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 |
Защо ти е да правиш eval_script
по този начин? Kernel.load
не върши ли работа?
Здрасти,
мерси за насоките! Направих 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
Хардкоднатия път към приложението е греда. Още повече, какво прави development проекта във /var/www
? Това ми мяза на някакви PHP навици, и то лоши.
trap
-а защо е в в loop
-а? Не върши ли работа ако го сложиш извън?
Иначе, яко. Ако ти се вдига level, може да разгледаш drb
за да не се занимаваш със сокети като грешен дявол.
Хардкоднатия път е защото ми трябва да си реша проблема само с 1 проект :), не съм го планирал за повевече от един прокет :)
Намира се във /var/www
приложението е измислено да работи там поради някаква причина ?!? Трябва да питам RedHat защот така са го решили :))
Относно trap
-a ... не мисля, че мога да ти дам разумент отговор ... мисля, че имаше някаква причина .... но не съм сигурен в момента!
Относно drb
мерси :) ще го погледна, изглежда наистина интересно.
Този сбит вариант на client.rb сам си затваря файла, няма нужда от останалите неща:
Какво е scl?