Как проверить, перешел ли pid?Linux

Ответить
Anonymous
 Как проверить, перешел ли pid?

Сообщение Anonymous »

Я пишу программу, которая будет периодически сканировать все процессы на машине. Я хочу кэшировать как можно больше, чтобы избежать какой-либо нагрузки на систему.
Я могу перечислить все доступные идентификаторы PID на машине с помощью ls /proc/[0-9]*, а затем перебрать список. Что мне использовать в качестве ключа кэша для защиты от повторного использования номера pid?
Другими словами, рассмотрим следующий код Python, который открывает два каталога pid в несколько разных моментов времени. Что нужно для сравнения каталогов, чтобы проверить, действительно ли они относятся к процессу?

Код: Выделить всё

pid_dir_fd1 = os.open("/proc/123", os.O_RDONLY)
time.sleep(1)
pid_dir_fd2 = os.open("/proc/123", os.O_RDONLY)
print(are_pid_dirs_equal(pid_dir_fd1, pid_dir_fd2))
Я не могу использовать pidfd, так как мне нужен доступ к файлам /proc/
/{cmdline,exe,stat,status для сбора информации о процессах. Или я могу? Я не знаю, как можно связать pidfd с файлом /proc//files.
Моя текущая идея — сравнить поле времени начала файла статистики процесса:

Код: Выделить всё

def read_text(file: str, dir_fd: int):
with os.open(file, dir_fd=dir_fd) as f:
return f.read()
def stat_field(statstr: str, idx: int):
return int(statstr.split(")")[-1].split()[idx - 3])

pid_dir_fd1 = os.open("/proc/123", os.O_RDONLY)
starttime1 = stat_field(read_text("stat", pid_dir_fd1), 22)
time.sleep(1)
pid_dir_fd2 = os.open("/proc/123", os.O_RDONLY)
starttime2 = stat_field(read_text("stat", pid_dir_fd2), 22)
if create_time1 == create_time2:
print("both directories are equal")
else:
print("pid_dir_fd1 died in the meantime")
Есть ли что-нибудь лучше?

Подробнее здесь: https://stackoverflow.com/questions/798 ... olled-over
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»