Я делаю библиотеку, которая должна порождать несколько процессов.
Я хочу знать множество всех процессов-потомков, которые были созданы во время теста.Это полезно для завершения хорошо функционирующих демонов в конце пройденного теста или для отладки тупиковых / зависающих процессов путем получения трассировки стека любых процессов, присутствующих после неудачного теста.
Поскольку для некоторых из них требуются демоны порождения(форк, форк, затем пусть родитель умирает), мы не можем найти все процессы путем итерации по дереву процессов.
В настоящее время мой подход таков:
- Регистрация обработчика с использованием
os.register_at_fork
- На ветвь, в дочерний файл, скопируйте файл и добавьте
(pid, process start time)
в другой файл - Затем, при необходимости, мы можем получить набор дочерних процессов, перебираязаписей в файле и сохраняющих те, где (pid, время начала процесса) соответствуют существующему процессу
Недостатки этого подхода:
- Работает только с
multiprocessing
или os.fork
- не работает при порождении нового процесса Python с использованием subprocess
или не-Python процесса. - Блокировка вокруг вилки может сделать вещи более детерминированными во времятесты, чем они будут в действительности, скрывая условия гонки.
Я ищу другой способ отслеживания дочерних процессов, который позволяет избежать этих двух недостатков.
Альтернативы, которые я рассмотрел:
- Использование bcc для регистрации зондов форка / клона - проблема в том, что для этого требуется root, что, я думаю, было бы немного раздражающе для запуска тестов с точки участникаиз вида.Есть ли что-то подобное, что может быть сделано как непривилегированный пользователь только для текущего процесса и потомков?
- Использование strace (или ptrace), аналогичного описанному выше, - проблема в этом - влияние на производительность.Некоторые из тестов специально ориентированы на время запуска, а ptrace имеет относительно большие накладные расходы.Возможно, было бы меньше, если бы только отслеживание форка и клона, но это все еще конфликтует с желанием получить стеки на время ожидания теста.
Может кто-нибудь предложить подход к этой проблеме, который избегает ловушек инедостатки из вышеупомянутых?Меня сейчас интересует только Linux, и в идеале для него не нужно ядро позже 4.15.