首页 > 解决方案 > 在linux中使用不同的pid重复相同的进程

问题描述

描述

我有一个 python 脚本,它使用os.popen(command). 启动所有进程后,它将使用psutil.process_iter()方法监视(每 3 秒)进程。有时它会显示具有相同进程名称(命令)的额外进程(重复)。但是当我使用调试时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

问题

上面的代码最初(大约在 30 秒内)返回 false(current_process_map > process_map),之后它正常工作(current_process_map == process_map)。这是 python 库或 centos(linux) 的问题吗?

标签: python-3.xlinuxcentos7psutil

解决方案


在 Unix 中,每当我们想要创建一个新进程时,我们都会 fork 当前进程,创建一个与父进程完全相同的新子进程;然后我们执行一个 exec 系统调用,用新进程的数据替换父进程的所有数据。

这是 linux 的预期行为。我已经更改了实现以在创建它们并在 5 秒后检查它们之后获取所有 pid。这样我就可以避免重复。

fork 和 execv 系统调用


推荐阅读