Używam child_process.spawn(), aby uruchomić skrypt z mojej aplikacji Node.JS uruchomionej na Ubuntu. O ile mi wiadomo, standardowe rozwidlone lub odradzane procesy * nix generalnie nie umierają, gdy rodzic umiera, ale podczas odradzania procesów z Node.JS, wydają się być zabijane, gdy moja aplikacja ulega awarii, lub jest przerywana przez ctrl-c itp.Procesy potomne Node.JS są zabijane, gdy rodzic umiera
Dlaczego tak się dzieje? Nie mogę znaleźć żadnej oczywistej opcji w API child_process.
Moja aplikacja uruchamia dość długo działające zadania, które powinny działać w tle, a jeśli mój serwer węzła ulegnie awarii lub zostanie ponownie uruchomiony z jakiegoś innego powodu, nie chcę przerywać zadań, zamiast tego chcę, aby serwer węzła powrócić i z wdziękiem wznowić monitorowanie postępów w wykonywaniu zadań.
Wielkie dzięki. Nie wiem JAK udało mi się tego nie zauważyć. Dla odniesienia, jeśli ktoś inny uzna tę odpowiedź za przydatną, oto instrukcja: https://nodejs.org/api/child_process.html#child_process_options_detached – JHH
Mam jednak jedną obawę. Instrukcja - i twój kod - w szczególności mówi, że stdio musi być skierowany gdzie indziej niż do procesu nadrzędnego (który jest domyślny), aby proces był kontynuowany w tle. Jednak odkryłem, że nawet jeśli nie określiłem żadnych opcji stdio, proces się nie powiódł, nawet po tym, jak zabiłem mój serwer węzła. Nie jestem pewien, co dokładnie się tutaj dzieje, ale może [ignoruj, ignoruj, ignoruj] jest mądrą opcją. – JHH
nie określanie stdio będzie domyślnie stdio: ['pipe', 'pipe', 'pipe'] ... co oznacza, że rury są dostępne przez ChildProcess.stdin, ChildProcess.stdout i ChildProcess.stderr (w tym przypadku ** I myślę ** musisz przeczytać ze stdout i stderr, w przeciwnym razie twoje dziecko może się zawiesić) ... jeśli nie musisz wchodzić w interakcję ze stdio childprosess z procesu nadrzędnego, możesz po prostu użyć opcji 'ignore', która przekaże dowolne wyjście z twojego childprocess do/dev/null – Johny