labctl.graywrk.ru
войти регистрация

Избавиться от процессов-зомби hard

name
zombie-reaper
image
labctl-base:3.12
timeout
30s
tags
processes, internals, signals

задание

Избавиться от процессов-зомби

В контейнере крутится демон zombie-maker — он плодит дочерние процессы,
которые завершаются, но родитель их не wait()'ит. В итоге в таблице
процессов копятся зомби (Z в ps//proc/<pid>/stat). init: true в
docker-compose отключён (намеренно) — это и есть условие задачи.

Симптомы

$ ps -eo pid,ppid,stat,cmd | awk '$3 ~ /Z/'
  123  122  Z  [python3] <defunct>
  125  122  Z  [python3] <defunct>
  ...

Или через /proc:

$ for p in /proc/[0-9]*; do
    s=$(awk '{print $3}' "$p/stat" 2>/dev/null)
    [ "$s" = "Z" ] && echo "$p zombie"
  done

Что нужно

Ни одного процесса в состоянии Z (zombie), чей командный путь или args
содержат python3 (маркер лабы — дочерние процессы демона).

Почему это hard

«Убить зомби» через kill -9 <pid> нельзя — зомби уже мёртв, ему нельзя
послать сигнал. Единственный способ убрать зомби — заставить родителя
сделать wait() (читать exit-статус), либо убить родителя (тогда зомби
репаются init'ом). В Docker без init: true PID 1 — это ваш процесс, и он
не всегда корректно репает детей. Решение зависит от архитектуры:

  • Если можете — почините родителя (демона), чтобы он корректно wait()'ил.
  • Если родителя трогать нельзя — перезапустите его или поставьте tini
    (легковесный init) как PID 1.
  • В реальном Docker: добавьте init: true в compose — но в этой лабе вы
    внутри контейнера, поэтому тот же эффект даёт exec tini -g -- <cmd> или
    ручной reaper.
checking… сессия: up → shell → check → down

попытки

  • загрузка…