TGViewer
BashTex | Linux BashTex | Linux @bash_tex · 2.52K subscribers
Post #633 624
/proc/PID/wchan: где именно завис процесс

Если процесс показывает высокий D в ps, сам статус ещё не говорит, на чём именно он остановился.

Для этого Linux предоставляет /proc/<PID>/wchan.

▪️Сначала найдём процесс

ps -eo pid,stat,wchan:30,cmd | grep '[D]'


Например:

2418 D    io_schedule     backup


Здесь wchan показывает kernel wait channel - функцию ядра, в которой процесс ожидает продолжения.

▪️Посмотреть напрямую

cat /proc/2418/wchan


Можно получить:

io_schedule


Или:

nfs_wait_bit_killable


Во втором случае уже появляется конкретная зацепка: процесс может ждать операции, связанной с NFS.

▪️Сравнить несколько процессов

for p in /proc/[0-9]*; do
pid=${p##*/}
state=$(awk '{print $3}' "$p/stat" 2>/dev/null)
[ "$state" = D ] || continue

printf '%-8s %s\n' \
"$pid" \
"$(cat "$p/wchan" 2>/dev/null)"
done


Получится примерно:

2418     io_schedule
2421 io_schedule
2517 nfs_wait_bit_killable


Если десятки процессов одновременно находятся в одном wchan, это уже может указывать на общий узкий участок.

▪️Посмотреть стек ядра

Для более глубокого разбора:

cat /proc/2418/stack


Можно увидеть цепочку вызовов ядра, в которой находится поток.

Например:

io_schedule
schedule
...


Доступ к /proc/PID/stack зависит от прав и настроек безопасности.

▪️Почему kill -9 иногда не помогает

Процесс в состоянии D находится в uninterruptible sleep. Если он ждёт завершения определённой операции ядра, SIGKILL не может мгновенно вывести его из этого состояния.

Поэтому вместо бесконечного:

kill -9 2418


полезнее сначала посмотреть:

ps -o pid,stat,wchan,cmd -p 2418
cat /proc/2418/wchan
cat /proc/2418/stack


Так можно понять, почему процесс не реагирует.

▪️Почему это важно

ps показывает симптом - D. wchan помогает увидеть причину ожидания на уровне ядра.

Для проблем с дисками, NFS, storage и зависшими I/O-операциями это один из самых быстрых способов перейти от «процесс завис» к пониманию, где именно он застрял.

BashTex 📱 #bash #linux
  • 👍 7
More from @bash_tex
  1. Oct 6, 2026Ephemeral ports - почему заканчиваются исходящие TCP-порты Когда приложение устанавливает…
  2. Oct 5, 2026name_to_handle_at() - как получить файловый объект без обычного пути В Linux обычно обраща…
  3. Oct 2, 2026madvise() - как процесс подсказывает ядру, как он собирается использовать память Когда про…
  4. Oct 1, 2026flock vs fcntl - почему две блокировки одного файла могут вести себя совершенно по-разному…
  5. Sep 30, 2026DEBUG trap - как Bash выполняет код перед каждой командой В Bash есть специальный DEBUG tr…
  6. Sep 29, 2026tee + process substitution: один поток и несколько получателей Иногда нужно одновременно:…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →