Избавиться от процессов-зомби 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.
терминал
закрывается при остановке сессии · Ctrl+D чтобы выйти · F11 полный экран
подсказки
⚠ открытые подсказки учитываются в рейтинге
попытки
- загрузка…