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:
W после номера дескриптора — блокировка на запись. Её держит archiver, importer только ждёт.
Блокировку 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 — у кого блокировка.