Тот же процесс дублируется с разными пидами в linux - PullRequest
0 голосов
/ 29 января 2020

Описание

У меня есть сценарий python, который охватывает некоторые процессы с использованием os.popen(command). После запуска всех процессов он будет контролировать (каждые 3 секунды) процессы, используя метод psutil.process_iter(). Иногда он показывает дополнительный процесс (дубликаты) с тем же именем процесса (команда). Но когда я отлаживаю с помощью watch -n 1 ps -ef | grep command, дубликатов нет.

Подробности среды:

CentOS 7 и python 3.7

Код

import psutil
def monitor_process(process_map):
   processes = psutil.process_iter()
   current_process_map = {}
   print("current_process_map::"+str(current_process_map))
   print("process_map::"+str(process_map))
   for process in processes:
      process_cmd_line = process.cmdline()
      current_process_map[process_cmd_line[1]] = current_process_map.get(process_cmd_line[1],0)+1
   for k,v in process_map:
      if v != current_process_map[k]:
         return False #spawned process and current process count mismatch
   return True

Проблема

Приведенный выше код возвращает false (current_process_map> process_map) первоначально (примерно в течение 30 секунд), после чего он работает должным образом (current_process_map == process_map). Это проблема с библиотекой python или centos (linux)?.

1 Ответ

0 голосов
/ 21 февраля 2020

В Unix всякий раз, когда мы хотим создать новый процесс, мы разветвляем текущий процесс, создавая новый дочерний процесс, который точно совпадает с родительским процессом; затем мы выполняем системный вызов exe c, чтобы заменить все данные из родительского процесса на данные для нового процесса.

Это ожидаемое поведение от linux. Я изменил реализацию, чтобы получить все pids после их создания и проверки через 5 секунд. Таким образом, я могу избежать дубликатов.

fork и execv системный вызов

...