При попытке обновить список пакетов доступных на сегодняшний день
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
Что это значит
:
- Процесс — «зомби» из прошлого: В колонке STIME (время старта) указан 2025 год. Это значит, что этот процесс висит на твоем сервере уже минимум месяц (или даже год, если сегодня 2026-й).
- Кто его запустил: PPID (родительский процесс) —
901227. Скорее всего, это какой-то системный скрипт или автоматическое обновление, которое «залипло». - TTY
?: Это подтверждает, что процесса нет в твоем текущем терминале. Он работает в фоне. - 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, этот процесс — «призрак».
Вот что говорит этот список «улик»:
- Он ничего не делает: В списке открытых файлов нет ни одного пакета (
.deb) или активного сетевого соединения. Он не качает обновления и не распаковывает их. - Он просто держит замок: В строке с дескриптором
4uWмы видим/var/lib/apt/lists/lock. Флаг W (write lock) означает, что он «застолбил» за собой право на обновление и никого больше не пускает. - Он изолирован: Его стандартный ввод (
0r) и вывод ошибок (2w) перенаправлены в/dev/null. То есть он работает в «полной тишине» и не может ничего тебе сказать. - Странная рабочая папка:
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), ждет ответа от фоновых подпроцессов, не получает его, засыпает на полсекунды и пробует снова. И так по кругу уже долгое время.
Фактически, процесс ждет того, чего никогда не случится.
Твой план действий (безвозвратное удаление):
- Принудительно заверши зависший процесс:bash
sudo kill -9 901255Используйте код с осторожностью.- После этого
straceуже не сможет к нему прикрепиться. - Удали файлы блокировки (потому что они не удалятся сами):bash
sudo rm /var/lib/apt/lists/locksudo rm /var/lib/dpkg/lock-frontsudo rm /var/lib/dpkg/lockИспользуйте код с осторожностью.- Восстанови порядок в пакетном менеджере:
Так какaptбыл убит «на лету», нужно дать системе шанс доделать то, что она хотела (если там что-то было):bash sudo dpkg --configure -asudo 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:
Это «король» визуализации.- Нажми
F2(Setup). - Выбери Display options.
- Отметь крестиком «Three view» и «Show custom thread names».
- Также в колонках можно добавить поле 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
Используйте код с осторожностью.
Что изменится:
- Когда Master SSHD сделает
clone(),straceнапишет:Process 1040526 attached. - Ты начнешь видеть, как ребенок читает ключи, проверяет
/etc/passwd, и самое интересное — как он передает данные твоемуbash. - В логе слева появятся номера PID, чтобы ты понимал, какая строчка к какому процессу относится.
Как посмотреть, чем занят УЖЕ работающий ребенок?
Если ты зашел по SSH и хочешь пошпионить за своей же сессией:
- Найди PID своего
bashили дочернегоsshdчерезpstree -p. - Прикрепись конкретно к нему:bash
sudo strace -p <PID_Bash>Используйте код с осторожностью.Теперь, когда ты будешь нажимать клавиши, ты увидишь системные вызовыread(0, ...)иwrite(1, ...).
Резюме:
Без флага -f ты видишь только «прихожую» (Master), где сторож проверяет билеты. Со флагом -f ты заходишь вместе с гостем «внутрь дома» и видишь всё, что он там делает.