【问题标题】:Same process duplicated with different pids in linux在linux中使用不同的pid重复相同的进程
【发布时间】:2020-01-29 18:01:57
【问题描述】:

说明

我有一个使用os.popen(command) 跨越一些进程的python 脚本。 启动所有进程后,它将使用 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.x linux centos7 psutil


    【解决方案1】:

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

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

    fork and execv system call

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-17
      • 2020-02-20
      • 2021-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多