如何识别子进程的子进程
How can one identify children of a child process?
我有一个长期运行的Python程序,作为其操作的一部分,它启动和停止Postgres服务器。我使用子进程生成pg_ctl -m fast
来停止服务器。作为后备,我检查返回代码,如果失败,则运行pg_ctl -m immediate
。
问题是有时两者都会失败。我自己还没能重现这一点,但对于我的程序的用户来说,这种情况会发生一些频率。我从pg_ctl调用中记录stdout/stderr,但没有得到任何有用的信息。据我所知,主进程或其子进程已经停止响应SIGQUIT,终止它们的唯一方法是使用SIGKILL,pg_ctl不使用它。
我基本上已经用尽了Postgres方面的想法。我使用的是Postgres8.3,所以我相信升级到更新的版本会解决这个问题,但不幸的是,这不是我的选择。我唯一能想到的解决方案是手动杀死孩子。但我不知道如何区分由我的pg_ctl start
和可能在机器上运行的其他postgres
进程生成的子进程。
有没有一种方法可以将一个进程识别为我所生成的另一个进程的子进程?从Python实现这一点的跨平台方法是理想的,但如果Windows/Linux/UNIX上有API,我愿意编写一个C扩展。
这里有一个简单的shell脚本解决方案:
pgrep -P $(head -1 $PGDATA/postmaster.pid)
这将打印出子进程的PID。
我不知道有什么标准的Python模块可以获得这些信息。pgrep
从/proc
获得信息,所以您可以在Python中重新实现它,但我怀疑这是否值得。
C++标准不知道多进程系统。因此,没有API用于与流程交互。(毕竟,标准如何在8位微控制器上强制要求多处理系统?)
此外,一些平台(例如Windows NT上的Win32子系统)不跟踪进程的父子关系。(NT是秘密的,但你必须调用未记录的API才能获取信息)
我很确定POSIX确实定义了这样的API,但我自己并没有使用过。
- 终止 QProcess 不会终止子进程
- 什么时候最好在子进程中使用 CPU 或 I/O 密集型代码 [ C++ ]
- 子进程更新共享 mmap 内存,但父进程没有更改
- 使用 waitpid 时等待子进程终止
- 使用重定向标准处理子进程中的 kbhit
- 由 JOB 中的进程启动的子进程是否可以将 JOB 属性设置为脱离作业?
- 是否可以将子进程的 stdout 重定向到父进程中的另一个文件?
- kill() 总是返回 0(成功),即使在子进程已经结束之后?
- 父进程和子进程之间的 POSIX 信号量
- 检测到由于操作系统内存不足而导致子进程终止
- 使用system()创建独立的子进程
- 从stdin读取时子进程挂起(fork/dup2竞争条件)
- 在 Bash 脚本中处理来自子进程的信号
- Qt C++ - 如何成功将数据传递给子进程?
- C++ 窗口本地系统模拟在子进程中失败
- 将类型化数组写入子进程 stdin 无法正常工作
- 将 nodejs 脚本作为子进程执行(而不是从其他脚本执行)
- 使用信号检测子进程何时终止的最佳方法是什么?
- 无法识别子进程中的Googletest Explicit FAIL()
- 如何识别子进程的子进程