Как посмотреть зависший процесс. Как диагностировать и Выводы. linux

При попытке обновить список пакетов доступных на сегодняшний день

sudo apt update

выдало ошибку

cbadmin@Ubun2204H1:~$ sudo apt update
[sudo] password for cbadmin:
Reading package lists... Done
E: Could not get lock /var/lib/apt/lists/lock. It is held by process 901255 (apt-get)
N: Be aware that removing the lock file is not a solution and may break your system.
E: Unable to lock directory /var/lib/apt/lists/

Как мы ее диагностировали

Через ps (статус):
ps -fp 901255 — узнаешь, какая именно команда выполняется.

Через top / htop:
Нажми F4 и введи 901255, чтобы увидеть нагрузку.

Через lsof (какие файлы открыл):
sudo lsof -p 901255 — увидишь, какие пакеты он сейчас распаковывает или скачивает.

Через strace (самый «хакерский» способ):
sudo strace -p 901255 — в консоль посыплются системные вызовы в реальном времени. Если там бегут строки — процесс работает. Если всё замерло — он висит.

вот что получали


cbadmin@Ubun2204H1:~$ ps -fp 901255
UID          PID    PPID  C STIME TTY          TIME CMD
root      901255  901227  0  2025 ?        00:30:47 apt-get -qq -y update

Что это значит

:

  1. Процесс — «зомби» из прошлого: В колонке STIME (время старта) указан 2025 год. Это значит, что этот процесс висит на твоем сервере уже минимум месяц (или даже год, если сегодня 2026-й).
  2. Кто его запустил: PPID (родительский процесс) — 901227. Скорее всего, это какой-то системный скрипт или автоматическое обновление, которое «залипло».
  3. TTY ?: Это подтверждает, что процесса нет в твоем текущем терминале. Он работает в фоне.
  4. CMD -qq: Флаг -qq (quite-quite) означает «полная тишина». Он не выводит никаких сообщений.

В

Скорее всего, сервер пытался обновиться автоматически, но в процессе пропал интернет или произошел сбой файловой системы, и apt ушел в бесконечный цикл. Раз он висит так долго, «доделывать» там нечего — его нужно только удалять.

Далее посмотрели глубже

cbadmin@Ubun2204H1:~$ sudo lsof -p 901255
lsof: WARNING: can't stat() fuse.portal file system /run/user/128/doc
      Output information may be incomplete.
lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/128/gvfs
      Output information may be incomplete.
lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
      Output information may be incomplete.
lsof: WARNING: can't stat() fuse.portal file system /run/user/1000/doc
      Output information may be incomplete.
COMMAND    PID USER   FD   TYPE             DEVICE SIZE/OFF     NODE NAME
apt-get 901255 root  cwd    DIR                8,3     4096   524304 /var/backups
apt-get 901255 root  rtd    DIR                8,3     4096        2 /
apt-get 901255 root  txt    REG                8,3    51680  1182216 /usr/bin/apt-get
apt-get 901255 root  mem    REG                8,3  5716816  1179832 /usr/lib/locale/locale-archive
apt-get 901255 root  mem    REG                8,3   149760  1207190 /usr/lib/x86_64-linux-gnu/libgpg-error.so.0.32.1
apt-get 901255 root  mem    REG                8,3   940560  1181958 /usr/lib/x86_64-linux-gnu/libm.so.6
apt-get 901255 root  mem    REG                8,3  1296312  1207108 /usr/lib/x86_64-linux-gnu/libgcrypt.so.20.3.4
apt-get 901255 root  mem    REG                8,3   807936  1184501 /usr/lib/x86_64-linux-gnu/libsystemd.so.0.32.0
apt-get 901255 root  mem    REG                8,3  2220400  1181894 /usr/lib/x86_64-linux-gnu/libc.so.6
apt-get 901255 root  mem    REG                8,3    39024  1189232 /usr/lib/x86_64-linux-gnu/libcap.so.2.44
apt-get 901255 root  mem    REG                8,3    80080  1208145 /usr/lib/x86_64-linux-gnu/libxxhash.so.0.8.1
apt-get 901255 root  mem    REG                8,3   166240  1179757 /usr/lib/x86_64-linux-gnu/libudev.so.1.7.2
apt-get 901255 root  mem    REG                8,3   841808  1208161 /usr/lib/x86_64-linux-gnu/libzstd.so.1.4.8
apt-get 901255 root  mem    REG                8,3   125152  1207442 /usr/lib/x86_64-linux-gnu/liblz4.so.1.9.3
apt-get 901255 root  mem    REG                8,3   170456  1207444 /usr/lib/x86_64-linux-gnu/liblzma.so.5.2.5
apt-get 901255 root  mem    REG                8,3    74848  1206795 /usr/lib/x86_64-linux-gnu/libbz2.so.1.0.4
apt-get 901255 root  mem    REG                8,3   108936  1208153 /usr/lib/x86_64-linux-gnu/libz.so.1.2.11
apt-get 901255 root  mem    REG                8,3   125488  1182555 /usr/lib/x86_64-linux-gnu/libgcc_s.so.1
apt-get 901255 root  mem    REG                8,3  2260296  1182005 /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.30
apt-get 901255 root  mem    REG                8,3  1859008  1180035 /usr/lib/x86_64-linux-gnu/libapt-pkg.so.6.0.0
apt-get 901255 root  mem    REG                8,3   412048  1182237 /usr/lib/x86_64-linux-gnu/libapt-private.so.0.0.0
apt-get 901255 root  mem    REG                8,3    27002  1190487 /usr/lib/x86_64-linux-gnu/gconv/gconv-modules.cache
apt-get 901255 root  mem    REG                8,3   240936  1181800 /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
apt-get 901255 root    0r   CHR                1,3      0t0        5 /dev/null
apt-get 901255 root    1u  unix 0xffff9249733ed940      0t0 13331495 type=STREAM
apt-get 901255 root    2w   CHR                1,3      0t0        5 /dev/null
apt-get 901255 root    3w   CHR                1,3      0t0        5 /dev/null
apt-get 901255 root    4uW  REG                8,3        0   524866 /var/lib/apt/lists/lock
apt-get 901255 root    5r  FIFO               0,14      0t0 13328920 pipe
apt-get 901255 root    6r  FIFO               0,14      0t0 13328922 pipe
apt-get 901255 root    7r  FIFO               0,14      0t0 13328979 pipe
apt-get 901255 root    8w  FIFO               0,14      0t0 13328921 pipe
apt-get 901255 root    9r  FIFO               0,14      0t0 13326329 pipe
apt-get 901255 root   10w  FIFO               0,14      0t0 13328923 pipe
apt-get 901255 root   12w  FIFO               0,14      0t0 13328980 pipe
apt-get 901255 root   14w  FIFO               0,14      0t0 13326330 pipe

Судя по выводу lsof, этот процесс — «призрак».

Вот что говорит этот список «улик»:

  1. Он ничего не делает: В списке открытых файлов нет ни одного пакета (.deb) или активного сетевого соединения. Он не качает обновления и не распаковывает их.
  2. Он просто держит замок: В строке с дескриптором 4uW мы видим /var/lib/apt/lists/lock. Флаг W (write lock) означает, что он «застолбил» за собой право на обновление и никого больше не пускает.
  3. Он изолирован: Его стандартный ввод (0r) и вывод ошибок (2w) перенаправлены в /dev/null. То есть он работает в «полной тишине» и не может ничего тебе сказать.
  4. Странная рабочая папка: cwd (текущая директория) — /var/backups. Это нетипично для обычного ручного запуска apt-get, что подтверждает теорию о зависшем системном скрипте.

Вердикт:

Этот процесс завис навсегда. Он не «доделает» работу, сколько бы ты ни ждал, потому что он просто спит, удерживая системный замок.

И почледняя проверка что внутри процесса

cbadmin@Ubun2204H1:~$ sudo strace -p 901255
strace: Process 901255 attached
pselect6(10, [5 6 7 9], [], NULL, {tv_sec=0, tv_nsec=69900429}, NULL) = 0 (Timeout)
pselect6(10, [5 6 7 9], [], NULL, {tv_sec=0, tv_nsec=500000000}, NULL) = 0 (Timeout)
pselect6(10, [5 6 7 9], [], NULL, {tv_sec=0, tv_nsec=500000000}, NULL) = 0 (Timeout)
pselect6(10, [5 6 7 9], [], NULL, {tv_sec=0, tv_nsec=500000000}, NULL) = 0 (Timeout)
pselect6(10, [5 6 7 9], [], NULL, {tv_sec=0, tv_nsec=500000000}, NULL) = 0 (Timeout)
pselect6(10, [5 6 7 9], [], NULL, {tv_sec=0, tv_nsec=500000000}, NULL) = 0 (Timeout)
pselect6(10, [5 6 7 9], [], NULL, {tv_sec=0, tv_nsec=500000000}, NULL) = 0 (Timeout)
pselect6(10, [5 6 7 9], [], NULL, {tv_sec=0, tv_nsec=500000000}, NULL) = 0 (Timeout)
pselect6(10, [5 6 7 9], [], NULL, {tv_sec=0, tv_nsec=500000000}, NULL) = 0 (Timeout)
pselect6(10, [5 6 7 9], [], NULL, {tv_sec=0, tv_nsec=500000000}, NULL) = 0 (Timeout)
pselect6(10, [5 6 7 9], [], NULL, {tv_sec=0, tv_nsec=500000000}, NULL) = 0 (Timeout)
pselect6(10, [5 6 7 9], [], NULL, {tv_sec=0, tv_nsec=500000000}, NULL) = 0 (Timeout)
pselect6(10, [5 6 7 9], [], NULL, {tv_sec=0, tv_nsec=500000000}, NULL) = 0 (Timeout)
pselect6(10, [5 6 7 9], [], NULL, {tv_sec=0, tv_nsec=500000000}, NULL^Cstrace: Process 901255 detached

Этот strace — финальное доказательство. Процесс окончательно завис в бесконечном цикле.

Что мы видим в логе:

Системный вызов pselect6 с результатом Timeout означает, что apt-get опрашивает свои внутренние каналы связи (те самые pipe, которые мы видели в lsof), ждет ответа от фоновых подпроцессов, не получает его, засыпает на полсекунды и пробует снова. И так по кругу уже долгое время.

Фактически, процесс ждет того, чего никогда не случится.

Твой план действий (безвозвратное удаление):

  1. Принудительно заверши зависший процесс:bash
  2. sudo kill -9 901255 Используйте код с осторожностью.
  3. После этого strace уже не сможет к нему прикрепиться.
  4. Удали файлы блокировки (потому что они не удалятся сами):bash
  5. sudo rm /var/lib/apt/lists/lock
  6. sudo rm /var/lib/dpkg/lock-front
  7. sudo rm /var/lib/dpkg/lock Используйте код с осторожностью.
  8. Восстанови порядок в пакетном менеджере:
    Так как apt был убит «на лету», нужно дать системе шанс доделать то, что она хотела (если там что-то было):bash
  9. sudo dpkg --configure -a
  10. sudo apt update Используйте код с осторожностью.

Почему так вышло?

Обычно это случается, когда apt-get update запускает дочерние процессы для скачивания (например, /usr/lib/apt/methods/http). Если такой дочерний процесс упал или «завис» из-за проблем с сетью, родительский apt-get может остаться в состоянии бесконечного ожидания ответа по каналу (pipe), что мы и увидели в strace.

По итогу после того как убили мягко процесс

Убил жёстко процесс

Удалили не доделанные пакеты

Запустили заного sudo apt update и установли хотели по итогу установить apach

Более глубокий разбор процессов вообще и вот ссылка на отдельную статью

  • Все процессы с их TTY:bash
  • ps -aef Используйте код с осторожностью.
  • Здесь в колонке TTY будет указано имя терминала (например, pts/0), а знак ? означает, что процесс фоновый (системный) и не привязан к терминалу.
  • Только процессы текущего пользователя с привязкой к TTY:bash
  • ps -u $(whoami) -f Используйте код с осторожностью.
  • Удобный список (дерево процессов):bash
  • ps axjf
  • Используйте код с осторожностью.
  • Позволяет увидеть иерархию: какой процесс кого породил.

2. Как посмотреть потоки (Threads)

В Linux поток (thread) технически является «легковесным процессом», поэтому команды похожи.

  • Список всех потоков через ps:bash
  • ps -eLf Используйте код с осторожностью.Колонка LWP (Light Weight Process) — это ID потока, а NLWP — общее количество потоков у данного процесса.
  • Потоки конкретного процесса (например, твой 901255):bash
  • ps -fL -p 901255 Используйте код с осторожностью.
  • Дерево потоков через pstree:bash
  • pstree -p -t Используйте код с осторожностью.Это самый наглядный способ увидеть, как потоки «растут» из основного процесса.

3. Интерактивные способы (Самые удобные)

  • top:
    Находясь внутри top, нажми клавишу H (большую). Это включит/выключит отображение потоков. В колонке TTY (если её добавить через f) будет виден терминал.
  • htop:
    Это «король» визуализации.
    1. Нажми F2 (Setup).
    2. Выбери Display options.
    3. Отметь крестиком «Three view» и «Show custom thread names».
    4. Также в колонках можно добавить поле TTY.
      В htop потоки обычно подсвечены зеленым цветом и идут сразу под родительским процессом.

Итог:

  • Нужно быстро и в файл? — ps -eLf
  • Нужно красиво и наглядно? — htop (нажми t для дерева).
  • Нужно понять структуру? — pstree -ap

Разбор

pstree -ap

Вывод pstree -ap — это «генеалогическое древо» вашей системы. Вот как его правильно читать, используя ваш пример:

1. Как читать структуру

  • Имя и PID: Например, cron,467. Слева — имя процесса, справа через запятую — его идентификатор (PID).
  • Ветвление (├─└─): Это иерархия. Процесс, который находится выше и левее — родитель. Те, что «растут» из него справа — дочерние процессы.
  • Фигурные скобки {...}: Это потоки (threads). Они работают внутри одного процесса, делят его память, но выполняют разные задачи параллельно.

2. Разбор конкретных веток из вашего лога

Ветка APT (Ваша проблема с lock-файлом):

text

systemd,1 (Главный предок)
  └─apt.systemd.dai,901223 (Системная служба обновлений)
      └─apt.systemd.dai,901227 (Скрипт, который держит lock-файл)
          └─apt-get,901255 (Тот самый зависший процесс)
              ├─gpgv,901275 (Проверка подписей)
              ├─http,901264 (Метод загрузки данных)
              └─store,901338 (Запись на диск)

Используйте код с осторожностью.

Вывод: Вы теперь точно видите всю цепочку. Если убить 901223, вся эта «гирлянда» исчезнет.

Ветка графической оболочки (GNOME Shell):

text

gnome-shell,865
   ├─ibus-daemon,967 (Ввод текста/раскладка)
   ├─{gnome-shell},868 (Поток №1 оболочки)
   ├─{gnome-shell},870 (Поток №2 оболочки)

Используйте код с осторожностью.

Вывод: Оболочка gnome-shell (PID 865) запустила один дочерний процесс (ibus-daemon) и породила около 20 потоков для отрисовки интерфейса, работы с сетью и т.д.

3. Значение ключей команды

  • -a (arguments): Показывает аргументы запуска (например, --no-daemon или пути к файлам). Это помогло увидеть, что apt-get запущен с флагами -qq -y update.
  • -p (pids): Добавляет номера PID к именам. Без этого ключа вы бы знали, что процесс есть, но не знали бы, какой номер вводить в kill.

Итог:

Если вы видите в дереве процесс, который «висит», и под ним есть дочерние ветки (как у вашего apt-get), значит, родитель ждет завершения детей. Если дети тоже не меняют PID и «замерли» — вся ветка зависла.

как посмотреть и проследить

Процесс 608158 — это Master SSHD. Его работа — слушать порт 22 и «рожать» (форкать) детей. Как только ребенок создан, Master SSHD отходит в сторону и снова засыпает в ожидании нового стука в дверь.

Почему ты не видишь работу ребенка?

Когда происходит clone() (или fork()), создается новый PID. Твой strace привязан только к PID 608158. Всё, что делает ребенок (шифрование, проверка пароля, выполнение твоих команд в Bash), происходит в другом адресном пространстве.

Как увидеть всё древо (и родителей, и детей)?

Если ты хочешь, чтобы strace автоматически «подцеплялся» ко всем новым процессам, которые создает основной «сторож», добавь флаг -f (follow):

bash

sudo strace -f -p 608158

Используйте код с осторожностью.

Что изменится:

  1. Когда Master SSHD сделает clone()strace напишет: Process 1040526 attached.
  2. Ты начнешь видеть, как ребенок читает ключи, проверяет /etc/passwd, и самое интересное — как он передает данные твоему bash.
  3. В логе слева появятся номера PID, чтобы ты понимал, какая строчка к какому процессу относится.

Как посмотреть, чем занят УЖЕ работающий ребенок?

Если ты зашел по SSH и хочешь пошпионить за своей же сессией:

  1. Найди PID своего bash или дочернего sshd через pstree -p.
  2. Прикрепись конкретно к нему:bash
  3. sudo strace -p <PID_Bash> Используйте код с осторожностью.Теперь, когда ты будешь нажимать клавиши, ты увидишь системные вызовы read(0, ...) и write(1, ...).

Резюме:
Без флага -f ты видишь только «прихожую» (Master), где сторож проверяет билеты. Со флагом -f ты заходишь вместе с гостем «внутрь дома» и видишь всё, что он там делает.

Оставьте комментарий