sleep 5
puts 'Server started'
loop { }
I jak go odpalam tak z irb-a:
arr = Open3.popen3('ruby server.rb')
arr[1].gets
To gets sobie wisi w nieskończoność, ale jak zrobię interupt i ponownie arr[1].gets to odrazu dostaję komunikat ‘Server started’. Co ciekawe, jak nie mam loop { } w serverze, to arr[1].gets zwraca wynik po zakończeniu pracy server-a.
Jak sprawić, by gets w powyższym kodzie działał za pierwszym razem?
To chyba tak samo działa w C, jeśli nie zrobisz fflush to proces czytający dostanie kiedyś te informacje – jak system operacyjny uzna że już czas.
Zastanawia mnie jedynie co chcesz w ten sposób osiagnąć. Jeśli ma to być sposób na IPC, to jest to jak widzisz podejście raczej błędne, w Ruby masz DRB którym bardzo fajnie możesz się komunikować pomiędzy procesami.
Jak dokładnie byś to zrobił (sprawdzenie outputu ps)?[/quote]
[code]>> Process.kill 0, 81837
=> 1
Process.kill 0, 999999
Errno::ESRCH: No such process - No such process[/code]
Pewnie istnieje lepszy sposób, ale pamiętam, że tak kiedyś to robiłem, jak znajdziesz coś w googlach, to wklej dla potomnych
Masz pomysł, jak to zrobić w jRuby, który niestety nie pozwala rejestrować poprawnie przechwycenia sygnałów (albo co najmniej są z tym problemy)?[/quote]
Tutaj chyba nie potrzebne Ci są sygnały, sprawdzasz tylko czy pidfile istnieje, np. File.exists?(‘tmp/pidfiles/myserver.pid’)
Jak dokładnie byś to zrobił (sprawdzenie outputu ps)?[/quote]
[code]>> Process.kill 0, 81837
=> 1
Process.kill 0, 999999
Errno::ESRCH: No such process - No such process[/code]
Pewnie istnieje lepszy sposób, ale pamiętam, że tak kiedyś to robiłem, jak znajdziesz coś w googlach, to wklej dla potomnych ;)[/quote]
Ale tak to tylko zabijesz proces, nie sprawdzisz czy
Masz pomysł, jak to zrobić w jRuby, który niestety nie pozwala rejestrować poprawnie przechwycenia sygnałów (albo co najmniej są z tym problemy)?[/quote]
Tutaj chyba nie potrzebne Ci są sygnały, sprawdzasz tylko czy pidfile istnieje, np. File.exists?(‘tmp/pidfiles/myserver.pid’)[/quote]
Tak się da, ale muszę odpalać skrypt z innego pliku ruby (ok, w pytaniu o to chodziło), ale nie zawsze tak to działa.
“(…) If sig is 0, then no signal is sent, but error checking is still performed; this can be used to check for the existence of a process ID or process group ID. (…)”
Musisz napisać bardziej szczegółowo co chcesz zrobić.
PS. Może to być mylące, ale kill nie zabija procesu tylko wysyła do niego sygnał. Oczywiście są sygnały służące do kończenia działania, czy wręcz wymuszania zakończenia, ale są też sygnały takie jak np. HUP, które są wykorzystywane zazwyczaj do przeładowania stanu/konfiguracji (np. nginx). Są też programy (uniksowe dd), które jak otrzyma sygnał USR1 to wyświetli progress operacji