Je voudrais être en mesure d'écrire un programme ruby qui peut redémarrer sans abandonner ses connexions socket.Comment créer des sockets réseau persistants sous Unix dans Ruby?
0
A
Répondre
1
Ce programme obtient la page d'accueil de Google, puis lorsque vous passez SIG_INT via ctrl-c il redémarre le programme et lit la sortie de la page d'accueil de la socket ouverte avec Google.
#!/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
Vous parlez de sockets réseau, pas de sockets UNIX, je suppose? Je ne suis pas sûr que cela corresponde à vos besoins, mais la façon dont je le ferais est de séparer la partie réseau et logique, et de redémarrer uniquement la partie logique, puis de reconnecter la partie logique à la partie réseau.
Lors du redémarrage: simple_connector.rb: 8: 'Initialiser ': Mauvais descripteur de fichier (Errno :: EBADF) de simple_connector.rb: 8:' ouvert' de simple_connector.rb: 8: ' ' –
Paul
De http://www.ruby-doc.org/core-2.1.2/IO.html#method-i-close_on_exec-3D Ruby définit par défaut les indicateurs close-on-exec de tous les descripteurs de fichiers depuis Ruby 2.0.0. Donc, vous n'avez pas besoin de définir par vous-même. En outre, si vous désactivez un indicateur close-on-exec, le descripteur de fichier risque de fuir si un autre thread utilise fork() et exec() (via la méthode system() par exemple). Si vous avez vraiment besoin d'un héritage de descripteur de fichier pour le processus enfant, utilisez l'argument de spawn() tel que fd => fd. – ryantm
Ce que j'ai fait - avez pris votre exemple sans aucun changement. Pourriez-vous donner un exemple de la façon de traiter le drapeau close-on-exec de la bonne façon? Devrais-je simplement le mettre à vrai avant exec? – Paul