节点或shell脚本中有没有办法知道子进程是不是启动了自己的子进程?

Posted

技术标签:

【中文标题】节点或shell脚本中有没有办法知道子进程是不是启动了自己的子进程?【英文标题】:Is there a way in node or shell-scripting to know if a child process starts its own subprocess?节点或shell脚本中有没有办法知道子进程是否启动了自己的子进程? 【发布时间】:2019-05-18 03:15:29 【问题描述】:

假设我有一个简单的 1 行 shell 脚本 test.sh 可以启动其他进程,例如 npm startpython server.py

现在说我从父节点程序中运行该 shell 脚本,即:

let child = process.spawn("./test.sh");

节点进程是否有任何方法可以跟踪由该 shell 脚本启动的进程?假设我想获取 python 或 npm 进程的pid 并监控其生命周期。

了解 shell 脚本是否有办法执行此操作同样有用,因为我可以编写一个 shell 脚本来运行另一个 shell 脚本,然后让我的节点项目将我的 shell 脚本作为 man-in- 运行the-middle....所以如果 shell 或 node 可以做到,任何一种方式都可以。

有可能吗?

【问题讨论】:

另见:communication between multiple processes 【参考方案1】:

您可以在 python 中使用类似的方法列出进程的所有子进程,并提供父进程的 PID 作为第一个参数

#! /usr/bin/env python

import sys
import psutil

for child in psutil.Process(int(sys.argv[1])).children(recursive=True):
    print(child.pid)

【讨论】:

【参考方案2】:

在 Linux 上,您可以strace 目标进程并查找fork 系统调用。

在大多数其他平台上可能也可以使用类似的技术,但细节会有所不同。在某些平台上,您需要root 或同等权限才能检查进程的内部结构,即使它属于您自己。

【讨论】:

以上是关于节点或shell脚本中有没有办法知道子进程是不是启动了自己的子进程?的主要内容,如果未能解决你的问题,请参考以下文章

子进程和线程的区别

Shell脚本启停Docker

如何知道 vfork 函数中的父进程或子进程

markdown 创建一个知道子模块的非裸存储库。

shell脚本根据端口号kill掉进程

将window的shell脚本通过ftp传输到Linux服务器后, shell脚本中执行时提示“没有那个文件或目录”的解决办法