Ich möchte in der Lage sein, ein Ruby-Programm zu schreiben, das neu starten kann, ohne seine Socket-Verbindungen fallen zu lassen.Wie mache ich dauerhafte Netzwerk-Sockets unter Unix in Ruby?
0
A
Antwort
1
Dieses Programm ruft die Startseite von Google auf und wenn Sie es dann über CTRL-C SIG_INT übergeben, startet es das Programm neu und liest die Ausgabe der Homepage aus der geöffneten Socket mit 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
Sie sprechen über Netzwerk-Sockets, nicht UNIX-Sockets, nehme ich an?
Ich bin nicht sicher, dass dies Ihren Anforderungen entspricht, aber die Art, wie ich es tun würde, ist durch die Trennung der Netzwerk-und Logikteil, nur den Logikteil neu starten, dann verbinden Sie den Logikteil mit dem Netzwerk-Teil.
Verwandte Themen
- 1. Wie mache ich String-Vergleich in Ruby?
- 2. Wie benutze ich CVS unter Unix?
- 3. Wie mache ich Screenshots von Webseiten mit Ruby und einem Unix-Server?
- 4. Wie mache ich docset unter Linux?
- 5. IsBadReadPtr analog unter Unix
- 6. Wie mache ich den Klassenkonstruktor in Ruby privat?
- 7. Wie mache ich vernünftige "Set-Differenz" in Ruby?
- 8. Wie mache ich Ruby erfassen den Syntaxfehler in Threads
- 9. Prozessgröße unter UNIX
- 10. Compiler-Problem unter UNIX
- 11. Funktioniert das unter Unix?
- 12. Unter welchen Umständen würde ich eruby benötigen, wenn ich nur Ruby Programmierung mache
- 13. Wie finde ich heraus, wo sich Python unter Unix befindet?
- 14. Wie könnte ich Unix gVim Einstellungen unter Windows verwenden?
- 15. UNIX-Zeitstempel zu ISO8601 in Ruby
- 16. Segmentierungsfehler unter Unix - mögliche Stapelkorruption
- 17. Portable Atomic Operations unter UNIX
- 18. Wie der Prozess unter UNIX/LINUX einzuengen
- 19. Entwicklung für iphone unter Unix
- 20. Verwenden von Unix-Prozesssteuerungsmethoden in Ruby
- 21. Wie mache ich SCP mit Ruby und einem privaten Schlüssel?
- 22. Application Control Scripts unter Unix
- 23. Datei in C++ unter UNIX entfernen
- 24. Wie mache ich eine Ruby-Zeichenfolge für ein Dateisystem sicher?
- 25. Test ODBC-Eintrag unter Unix
- 26. Wie mache ich Python-Skripte unter Windows ausführbar?
- 27. Wie mache ich ADB arbeiten unter Linux mit einem Motorola
- 28. Datei-Modifikationszeit unter UNIX unter Verwendung von utime in C
- 29. Wie mache ich Textumbruch über und unter einem div?
- 30. Networking Programmierkenntnisse unter UNIX-Umgebung
Beim Neustart: simple_connector.rb: 8: in 'initialisieren ': Bad Dateideskriptor (Errno :: EBADF) von simple_connector.rb: 8: in' open' von simple_connector.rb: 8: in ' ' –
Paul
Von http://www.ruby-doc.org/core-2.1.2/IO.html#method-i-close_on_exec-3D Ruby setzt standardmäßig seit Ruby close-on-exec Flags aller Dateideskriptoren 2.0.0. Sie müssen also nicht selbst festlegen. Das Deaktivieren eines Close-on-Exec-Flags kann außerdem zu einem Dateideskriptorverlust führen, wenn ein anderer Thread fork() und exec() (z. B. über die Methode system) verwendet. Wenn Sie wirklich eine Datei-Deskriptor-Vererbung für den Kind-Prozess benötigen, verwenden Sie das Argument von spawn() wie fd => fd. – ryantm
Was ich getan habe - habe dein Beispiel ohne Änderungen genommen. Könnten Sie ein Beispiel geben, wie man mit der Close-on-Exec-Flagge richtig umgehen kann? Soll ich es einfach auf "True" setzen? – Paul