Sobes.tech
Middle

Co się stanie, jeśli proces potomny się zakończy?

sobes.tech AI

Odpowiedź od AI

Proces rodzica otrzyma zdarzenie exit. Jeśli proces potomny zakończy się błędem, zostanie również wygenerowane zdarzenie error i zostanie przekazany obiekt błędu. Standardowe strumienie wejścia i wyjścia procesu potomnego (stdout, stderr) zostaną zamknięte, a proces rodzica musi obsłużyć te zdarzenia, aby uniknąć wycieków zasobów (np. wyczyszczenie obsługi zdarzeń).

Przykład obsługi zakończenia:

const { spawn } = require('child_process');

const child = spawn('ls', ['-lh', '/usr']);

child.stdout.on('data', (data) => {
  console.log(`stdout: ${data}`);
});

child.stderr.on('data', (data) => {
  console.error(`stderr: ${data}`);
});

child.on('error', (err) => {
  // Obsługa błędów podczas uruchamiania lub wykonywania procesu
  console.error('Nie można uruchomić podprocesu.', err);
});

child.on('exit', (code, signal) => {
  // Obsługa zakończenia procesu
  if (code !== 0) {
    console.warn(`Proces potomny zakończył się kodem ${code} i sygnałem ${signal}`);
  } else {
    console.log(`Proces potomny zakończył się pomyślnie.`);
  }
});

Jeśli proces rodzica nie nasłuchuje zdarzenia exit, będzie kontynuował swoje wykonanie. Jeśli proces potomny zakończy się błędem i zdarzenie error nie zostanie obsłużone, wystąpi nieobsłużony wyjątek i prawdopodobnie proces rodzica zakończy działanie.

Mogą również wystąpić procesy zombie, jeśli proces rodzica nie obsługuje zdarzenia exit i system operacyjny nie może poprawnie wyczyścić zasobów procesu potomnego. Dzieje się tak, gdy proces potomny zakończył się, ale jego PID i stan zakończenia pozostają w tabeli procesów, aż proces rodzica "zebra" jego stan.