Что такое сигнал SIGCHLD в Linux?

«Что такое сигнал SIGCHLD в Linux?» — вопрос из категории Linux, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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, чтобы перехватывать сигналы от своих дочерних процессов.