Linux Labs

Система изнутри: ресурсы, ядро, процессы / Ступень 7 из 12

strace и /proc: что делает процесс

Не запущена Запускается обычно ~20 с
Выйти из урока

Шаг 5 из 8 · теория · 6 мин

/proc: процесс изнутри

strace назвал вызов и номер файла, /proc переводит номер в имя. Остаётся найти, кого ждёт importer.

flock(3, LOCK_EX — importer просит блокировку файла с дескриптором 3 и ждёт: её держит другой процесс. Так программы договариваются не работать с одними данными одновременно.

/proc — каталог, который ядро собирает на лету. У каждого процесса в нём свой каталог по PID, а файлы внутри — то, что ядро знает о процессе сейчас:

Файл Что в нём
fd/ открытые файлы: номер дескриптора → путь, сокет или канал
status имя, состояние, родитель, владелец, память
cmdline, cwd, environ командная строка, текущий каталог, переменные окружения

Свой процесс читаешь без sudo, fd процесса root — только через sudo. Подключиться strace без sudo Ubuntu не даёт даже к своему процессу, если ты не запускал его из своей оболочки, — отсюда Operation not permitted.

Кто держит файл, ищут с другой стороны — по всем процессам сразу. Это делает lsof:

bash
lsof import.lock
# COMMAND  PID    USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
# archiver 950 student    3wW  REG  253,4        0 308088 import.lock
# importer 957 student    3w   REG  253,4        0 308088 import.lock

W после номера дескриптора — блокировка на запись. Её держит archiver, importer только ждёт.

Проверь себя 1 вопрос

Блокировку import.lock держит archiver, importer ждёт в flock. Что будет с importer, если archiver завершится?

  • Блокировку ядро снимает, когда держатель закрывает файл или завершается, и сразу отдаёт её ждущему процессу. Перезапуск не нужен.

  • Пропадает блокировка archiver, а файл import.lock остаётся на месте. Для importer это и есть момент, которого он ждал.

Когда archiver завершается, ядро снимает его блокировку и отдаёт её importer. Тот загружает заказы, пишет imported.txt и выходит — pgrep importer больше ничего не находит.

Главное в шаге

  • sudo strace -p <PID> показывает вызов, в котором процесс ждёт; без sudo Ubuntu не даёт подключиться.
  • /proc/<PID>/fd переводит номер дескриптора в файл, status — состояние и владельца процесса.
  • lsof <файл> находит все процессы с этим файлом; W в столбце FD — у кого блокировка.
Ubuntu 24.04
Загрузка…