Процесс работает с файлом, которого нет в каталоге. Так устроены имена файлов и так dpkg ставит обновление.
Имя в каталоге — только ссылка на сам файл, его inode. При обновлении dpkg пишет новый файл рядом со старым и переименовывает его поверх. Имя теперь ведёт к новому inode, а у старого не осталось ни одного имени — у lsof это 0 в столбце NLINK.
Файл без имени живёт, пока его держит хоть один процесс. httpd службы запустился до обновления: ядро отобразило программу в его память и выполняет её оттуда. Такие файлы ядро помечает (deleted) — в /proc процесса это видно так:
Исправленная программа лежит на диске, а работает прежняя — вместе с уязвимостью. Новый файл загрузит только новый процесс: службу перезапускают, sudo systemctl restart lab-feed. reload здесь не поможет: он посылает сигнал тому же процессу, и тот лишь перечитывает настройки.
Программу ночного отчёта обновили в 03:00. В 04:00 cron запустил отчёт заново. Что покажет sudo ls -l /proc/<PID>/exe у этого процесса?
-
Программа запускается из файла в каталоге, а архив
.debнужен только для установки. Ссылкаexeведёт на файл программы. -
Пометку получает процесс, запущенный до обновления. Процесс 04:00 открыл программу по имени, а имя уже ведёт к новому файлу.
Процесс, запущенный после обновления, открывает программу по имени и получает новый файл. Удалённый файл держат только процессы, которые работали ещё до обновления.
Главное в шаге
-
После обновления процесс, запущенный раньше, работает с удалённым файлом:
(deleted)в/proc/<PID>/exeиmaps,0вNLINKуlsof +L1. -
Новую программу загружает только новый процесс —
systemctl restart;reloadоставляет тот же процесс.