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.