python-3.x - 在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) 的问题吗?
解决方案
在 Unix 中,每当我们想要创建一个新进程时,我们都会 fork 当前进程,创建一个与父进程完全相同的新子进程;然后我们执行一个 exec 系统调用,用新进程的数据替换父进程的所有数据。
这是 linux 的预期行为。我已经更改了实现以在创建它们并在 5 秒后检查它们之后获取所有 pid。这样我就可以避免重复。
推荐阅读
- python - 如果在字典列表中找不到键,如何传递空字符串
- schema - 如何在 Shopify 的版块页面上调用产品图片、详细信息和价格?
- ios - 'sonar.coverage.jacoco.xmlReportPaths' 没有为 SonarQube 开发者版中的 swift 项目定义
- html - { 和 } 在 CSS 不同方向上的含义是什么?
- python - Python 生成 IAM 身份验证令牌 boto3.session
- php - 如何计算视图中的不同值
- flutter - 以 1 个月的飞镖语言显示周期日期
- java - org.apache.http.entityutils#toString() 在有效负载为空时分块传输编码的情况下导致 java.io.EOFException
- pandas - PANDAS 中的错误 - ZeroDivisionError:浮点除以零
- javascript - 如何使用 AJAX 获取和显示 API 响应