Soket bağlantılarını düşürmeden yeniden başlayabilen bir yakut programı yazmak istiyorum.Unix in Ruby'de nasıl kalıcı ağ soketleri yapabilirim?
0
A
cevap
1
Bu program Google'ın ana sayfasını alır ve ardından SIG_INT aracılığıyla ctrl-c'yi aktardığınızda programı yeniden başlatır ve ana sayfanın çıkışını Google ile açık soketten okur.
#!/usr/bin/ruby
#simple_connector.rb
require 'socket'
puts "Started."
if ARGV[0] == "restart"
sock = IO.open(ARGV[1].to_i)
puts sock.read
exit
else
sock = TCPSocket.new('google.com', 80)
sock.write("GET /\n")
end
Signal.trap("INT") do
puts "Restarting..."
exec("ruby simple_connector.rb restart #{sock.fileno}")
end
while true
sleep 1
end
0
Ağ soketleri hakkında konuşuyorsunuz, UNIX soketleri değil mi?
Bunun sizin gereksinimlerinize uygun olduğundan emin değilim, ancak bunu yapmamın yolu, ağ ve mantık bölümünü ayırmak ve yalnızca mantık bölümünü yeniden başlatmak, ardından mantık kısmını ağ kısmına yeniden bağlamaktır.
tekrar çalıştırırken: simple_connector.rb: 8: in 'başlatmak ': Hatalı dosya tanımlayıcısı simple_connector.rb dan (Errno :: EBADF) : 8: Açık' in': 8: simple_connector.rb dan ' –
Paul
http://www.ruby-doc.org/core-2.1.2/IO.html#method-i-close_on_exec-3D Ruby, Ruby'den beri varsayılan olarak tüm dosya tanıtıcılarının exec-on bayrakları işaretler. 2.0.0. Yani kendiniz ayarlamanıza gerek yok. Ayrıca, bir exec-on-bayrağı işaretinin iptal edilmesi, başka bir thread fork() ve exec() (örneğin, system() yöntemi aracılığıyla) kullanıyorsa dosya tanımlayıcısının sızdırmasına neden olabilir. Eğer çocuk süreçlerine dosya tanımlayıcısı devralma işlemine gerçekten ihtiyacınız varsa, spawn() argümanını fd => fd gibi kullanın. – ryantm
Ne yaptım - örneğini hiçbir değişiklik yapmadan aldım. Run-close bayrağıyla nasıl başa çıkılacağını örnek verebilir misiniz? Bunu exec'dan önce doğru olarak ayarlamalı mıyım? – Paul