Ответ
SIGCHLD — это сигнал, который ядро Linux отправляет родительскому процессу при изменении состояния его дочернего процесса (завершение, остановка SIGSTOP или возобновление SIGCONT).
Зачем это нужно в DevOps/администрировании?
Основная задача — предотвратить появление "зомби"-процессов (процессов, завершивших работу, но все еще занимающих запись в таблице процессов). Родительский процесс должен вызвать системный вызов wait() (или его варианты), чтобы получить статус завершения дочернего процесса и освободить ресурсы.
Практический пример в скрипте:
#!/bin/bash
# Устанавливаем обработчик для SIGCHLD
cleanup() {
echo "[$(date)] Дочерний процесс завершился. Выполняем wait."
wait -n # Ждем завершения любого дочернего процесса
}
trap cleanup SIGCHLD
# Запускаем несколько фоновых процессов
sleep 30 &
P1=$!
sleep 60 &
P2=$!
echo "Родительский процесс PID $$ запущен. Дочерние: $P1, $P2"
# Родительский процесс может продолжать свою работу
while true; do
echo "Родительский процесс работает..."
sleep 10
done
Ключевые моменты для DevOps:
- Демоны и супервизоры (systemd, supervisord) активно используют этот механизм для управления своими дочерними службами.
- Игнорирование SIGCHLD или отсутствие вызова
wait()может привести к утечке ресурсов (PID). - В контейнерах (Docker) процесс с PID 1 должен корректно обрабатывать SIGCHLD, чтобы перехватывать сигналы от своих дочерних процессов.