Jak rozpocząć i zapomnieć o podprocesie?
Mam długi proces uruchomiony i potrzebuję go do uruchomienia innego procesu (który również będzie działał przez dłuższy czas). Po prostu muszę to uruchomić, a potem zupełnie o tym zapomnieć.
Udało mi się zrobić to, czego potrzebowałem, zbierając kod z książki Programming Ruby, ale chciałem znaleźć lepszy/poprawny sposób i zrozumieć, co się dzieje. Oto, co otrzymałem na początku:
exec("whatever --take-very-long") if fork.nil?<del>
Process.detach($$)
Czy tak jest, czy jak inaczej mam to zrobić?
</del>Po sprawdzeniu odpowiedzi poniżej otrzymałem ten kod, który wydaje się mieć więcej sensu
:
(pid = fork) ? Process.detach(pid) : exec("foo")Byłbym wdzięczny za wyjaśnienie, jak działa
fork. [już zrozumiałem]
Czy odłączenie
$$było prawidłowe? Nie wiem, dlaczego to działa i naprawdę chciałbym lepiej zrozumieć sytuację.
Nie znaleziono powiązanych wyników
Zaproszony:
Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się
5 odpowiedzi
Anonimowy użytkownik
Potwierdzenie od:
Celem odłączenia się jest po prostu powiedzenie: „Nie obchodzi mnie, kiedy dziecko się kończy”, aby tego uniknąć
Procesy zombie.
http://en.wikipedia.org/wiki/Zombie_process
.
Anonimowy użytkownik
Potwierdzenie od:
Wtedy obie
proces uzyskać wynik funkcji. Dziecko otrzymuje zero/ (i dlatego wie, że jest dzieckiem), a rodzic otrzymuje PID dziecka.
W konsekwencji:
spowoduje, że dziecko zacznie „coś”, a rodzic będzie kontynuował tam, gdzie był.
Zwróć uwagę, że
zastępuje
bieżący proces na „coś”, więc proces potomny nigdy nie wykona żadnego kolejnego kodu Rubiego.
Wywołanie wygląda na nieprawidłowe. Spodziewałbym się, że będzie zawierał PID dziecka, ale jeśli poprawnie odczytam twój kod, to faktycznie odłącza proces nadrzędny.
Anonimowy użytkownik
Potwierdzenie od:
Fixnum numer procesu uruchomionego programu. [r/o]
Ta sekcja, „Zmienne i stałe” w rozdziale Język Ruby, jest bardzo przydatna do dekodowania różnych krótkich stałych ruby - jednakże wersja online (najpierw
W rzeczywistości oddzieliłeś program od siebie, a nie z jej dziecka.
Jak powiedzieli inni, prawidłowym sposobem odłączenia się od dziecka jest użycie pid dziecka zwróconego z .
Anonimowy użytkownik
Potwierdzenie od:
Podanie bloku nakazuje forkowi wykonanie tego bloku (i tylko tego bloku) w procesie potomnym, kontynuując w obiekcie nadrzędnym.
Anonimowy użytkownik
Potwierdzenie od:
Na wszelki wypadek, jeśli ktoś ma ten sam problem, moim celem było wejście na serwer SSH, a następnie kontynuować ten proces, aby pracować nieskończenie. Więc test.sh jest