pgrep -P,但对于孙子而不仅仅是孩子

2023-11-29

我在用:

pgrep -P $$

获取 $$ 的子进程 pid。但我实际上也想要一份孙子和曾孙的名单。

我该怎么做呢?例如,使用常规编程语言,我们会使用递归来做到这一点,但是使用 bash 呢?也许使用 bash 函数?


我已经发布了尝试解决方案。它简短而有效,并且似乎符合OP的问题,所以我将保持原样。然而,它存在一些性能和可移植性问题,这意味着它不是一个好的通用解决方案。此代码尝试解决以下问题:

top_pid=$1

# Make a list of all process pids and their parent pids
ps_output=$(ps -e -o pid= -o ppid=)

# Populate a sparse array mapping pids to (string) lists of child pids
children_of=()
while read -r pid ppid ; do
    [[ -n $pid && pid -ne ppid ]] && children_of[ppid]+=" $pid"
done <<< "$ps_output"

# Add children to the list of pids until all descendants are found
pids=( "$top_pid" )
unproc_idx=0    # Index of first process whose children have not been added
while (( ${#pids[@]} > unproc_idx )) ; do
    pid=${pids[unproc_idx++]}       # Get first unprocessed, and advance
    pids+=( ${children_of[pid]-} )  # Add child pids (ignore ShellCheck)
done

# Do something with the list of pids (here, just print them)
printf '%s\n' "${pids[@]}"

使用广度优先搜索来构建树的基本方法已被保留,但有关进程的基本信息是通过单次(符合 POSIX 标准)运行获得的ps. pgrep不再使用,因为它不在 POSIX 中并且可以运行多次。此外,从队列中删除项目的一种非常低效的方法(复制除其中一个元素之外的所有元素)已被索引变量的操作所取代。

在我的老式 Linux 系统上(大约有 400 个进程)在 pid 0 上运行时,平均(实际)运行时间为 0.050 秒。

我只在 Linux 上测试过它,但它只使用 Bash 3 功能和 POSIX 兼容功能ps所以它也应该适用于其他系统。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

pgrep -P,但对于孙子而不仅仅是孩子 的相关文章

  • ReferenceError:MongoDB shell 中未定义 require

    我尝试通过 Windows 命令 Windows 8 1 从 Mongo 客户端连接 MongoDB 当我使用require 在 javascript 中 我遇到如下错误 有人有同样的问题吗 我有错过任何一个吗require有关的npm安装
  • 有一种简单的方法可以忽略时间戳来区分日志文件吗?

    我需要比较两个日志文件 但忽略每行的时间戳部分 确切地说是前 12 个字符 有没有一个好的工具 或者一个聪明的 awk 命令 可以帮助我 根据您使用的 shell 您可以改变方法 Blair https stackoverflow com
  • 仅打印“docker-container ls -la”输出中的“Names”列

    发出时docker container ls la命令 输出如下所示 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a67f0c2b1769 busybox tail f dev
  • 这个对自身单位的列表理解是如何工作的?

    在 haskell IRC 频道中有人问 是否有一种简洁的方法来定义一个列表 其中第 n 个条目是之前所有条目的平方和 我认为这听起来像一个有趣的谜题 递归定义无限列表是我真正需要练习的事情之一 所以我启动了 GHCi 并开始尝试递归定义
  • 使用 posix shell 测试字符串中的正则表达式

    如何测试字符串是否与特定字符串匹配正则表达式与基本 无 bash 或任何其他 posix shell 脚本 在 if 语句中 您可以使用expr在 POSIX shell 中计算正则表达式的命令 s Abc expr s alpha 3 e
  • 如何用流程图表示递归函数?

    我需要在流程图上表示递归函数 我的问题是我不知道如何指示该函数可以一次在多个元素上调用自身 例如扫描图形的函数 有人有什么建议吗 在流程图中 您通常不会为循环之类的内容添加多次调用 您只需指示可以重复调用代码 直到满足条件为止 因此 对于递
  • 如何制作一个 bash 脚本来同时创建 40 个程序实例?

    我是新来的bash and Linux 我编写了一个程序 我想创建多个同时实例 现在 我通过打开 10 个新终端 然后运行该程序 10 次 我运行的命令是php home calculatedata php 使用 bash 脚本执行此操作的
  • 通往楼梯顶部的可能路径

    这是一个非常经典的问题 我听说谷歌在他们的面试中使用过这个问题 问题 制定一个递归方法 打印从楼梯底部到楼梯顶部的所有可能的独特路径 有 n 个楼梯 您一次只能走 1 步或 2 步 示例输出 如果它是一个有 3 级楼梯的楼梯 1 1 1 2
  • 搜索深度嵌套数组以更新对象

    我有一个深层嵌套的数据结构 我有兴趣匹配数组 和数组数组 中的某个值 然后将一些数据推送到随附的数组中 例如以下是我的数组colors并伴随着的是更多颜色数组可能存在也可能不存在 var myData color green moreCol
  • 如何在 shell 脚本中并行运行多个实例以提高时间效率[重复]

    这个问题在这里已经有答案了 我正在使用 shell 脚本 它读取 16000 行的输入文件 运行该脚本需要8个多小时 我需要减少它 所以我将其划分为 8 个实例并读取数据 其中我使用 for 循环迭代 8 个文件 并在其中使用 while
  • 通过powershell运行ADB命令

    所以我尝试通过 powershell 脚本运行一些 ADB 命令 这是我正在尝试做的一个简单示例 adb shell echo in adb shell su root echo you are now root ls cd data da
  • 为什么Racket中foldl的定义方式很奇怪?

    在 Haskell 中 与许多其他函数式语言一样 函数foldl被定义为 例如 foldl 0 1 2 3 4 10 这没关系 因为foldl 0 1 2 3 4 根据定义 0 1 2 3 4 但是 在 球拍 中 foldl 0 1 2 3
  • Javascript - deepEqual 比较

    问题 来自 Eloquent Javascript 第二版 第 4 章 练习 4 编写一个函数 deepEqual 它接受两个值 并且仅当它们相等时才返回 true 是相同的值或具有相同属性的对象 其值也是 与对 deepEqual 的递归
  • Java递归方法求阶乘返回负输出[重复]

    这个问题在这里已经有答案了 我知道这是溢出 但问题是 20 是相对较小的数字 这不应该发生 对吧 有没有更好的方法来查找大数 例如 1000 的阶乘 而不会得到这种奇怪的结果 public class RecursiveFunctionsE
  • 将相对符号链接转换为绝对符号链接

    如何在 bash 中递归地将相对符号链接转换为绝对符号链接 ln sf readlink f link link
  • chown:不允许操作

    我有问题 我需要通过 php 脚本为系统中的不同用户设置文件所有者权限 所以我通过以下命令执行此操作 其中 1002 是系统的用户 ID file put contents filename content system chown 100
  • Python最大递归,关于sys.setrecursionlimit()的问题

    我有一个问题sys setrecursionlimit 来自蟒蛇docs https docs python org 2 library sys html sys setrecursionlimit这个函数 将Python解释器堆栈的最大深
  • Linux 中的动态环境变量?

    Linux 中是否可以通过某种方式拥有动态环境变量 我有一个网络服务器 网站遵循以下布局 site qa production 我想要一个环境变量 例如 APPLICATION ENV 当我在 qa 目录中时设置为 qa 当我在生产目录中时
  • 对目录中的所有文件执行命令

    有人可以提供执行以下操作的代码 假设有一个文件目录 所有这些文件都需要通过程序运行 该程序将结果输出到标准输出 我需要一个脚本 该脚本将进入一个目录 对每个文件执行命令 并将输出连接到一个大输出文件中 例如 要在 1 个文件上运行命令 cm
  • 我在函数的最后一次递归调用中得到“方案应用程序而不是过程”

    所以这是代码 define time prime test n newline display n start prime test n runtime define start prime test n start time if pri

随机推荐

  • 在 Python 中下载文件

    import urllib2 sys if len sys argv 3 print Usage download py
  • 为 iOS 模拟器构建,但链接框架“****.framework”是为 iOS 构建的

    我无法再在模拟器上运行我的应用程序 网上建议我编辑我的project pbxproj 但这似乎不起作用 如何重新获得在模拟器上运行项目的能力 并仍然能够在设备上执行此操作 我正在开发另一个项目 该项目使用许多相同的框架 但它在模拟器上运行
  • 存档时链接器命令失败

    我想要archiveReact Native 项目用户使用最新的 Xcode 但总是失败 因为链接器命令失败 当我跑步时xcodebuild verbose Ld命令 那么错误是这样的 ld file not found build xxx
  • 合并时不会出现空格冲突

    我遇到了一个问题 其中一个大型提交更改了大约一千行代码 删除了行尾的空格并删除了制表符之前的空格 该项目还有大约 50 个拉取请求 当我的提交被合并时 所有这些请求都会发生冲突 有没有什么方法可以设置 git 以便在合并未来的提交时 它会忽
  • 带前导零的数字的反转

    我们如何反转 number 中带有前导零的数字 例如 如果输入是004 输出应该是 400 我写了下面的程序 但它仅在输入中没有前导零时才有效 int num cout lt lt Enter number lt
  • Karate API - Hello World 示例,但 POST (GraphQL) 创建/检索用户

    我的场景中有两个 graphQL 帖子 就像 Hello World 示例一样 我想创建一个用户 API createUser 然后检索该用户 API getUser 以运行断言 我不确定它是否是 graphQL Post 查询让我绊倒的
  • Swift:将符合 FloatingPoint 的值转换为 Double

    我正在编写浮点协议的扩展 我想以任何可能的方式将其转换为 Double extension FloatingPoint var toDouble Double return Double exactly self 0 compile err
  • 如何从媒体存储中删除单个文件?

    这段代码有效 getActivity getContentResolver delete MediaStore Audio Media EXTERNAL CONTEN T URI TITLE songdetails get index so
  • 将容器从 ACR 部署到 AKS

    我有一个容器 其中有一个非常简单的 Web 应用程序 已上传到 Azure 容器注册表 我创建了一个 AKS 集群 现在我想将容器部署到 AKS 中 我找到了许多关于此的教程 但它们似乎都引用了 YAML 文件 而这些文件的解释很少或根本没
  • java - 比较月份和年份的两个日期值

    我需要匹配两个日期 如果它们的月份 年份相同 我应该返回 true 否则返回 false 根据我的搜索 我找到了以下解决方案 还有其他更好的方法来进行这种比较吗 Calendar cal1 Calendar getInstance Cale
  • 如何使用带通配符的 AzureSearch

    我想搜索名称为 14009 00080300 的字段 并且希望仅搜索其中的一部分 例如 14009 000803 时获得命中 使用这段代码我没有得到任何点击 search 14009 000803 count true top 10 有没有
  • SharedSecrets机制是如何工作的?

    jdk internal misc SharedSecrets自我描述为 共享秘密 的存储库 这是一种机制 调用另一个包中的实现私有方法而不需要 使用反射 包私有类实现了一个公共类 接口并提供调用包私有方法的能力 在该包内 实现该接口的对象
  • Visual Studio Express 2012 for Desktop 中没有 Metro 项目模板?

    两个下载页面桌面版 and 对于 Windows 8提供相同的 Web 安装程序 名为 Visual Studio Express 2012 for Windows Desktop 我安装了它 这是它的 新项目 窗口 In 本教程页面 它说
  • 如何使用 Accessstoken 通过图 api 向 Facebook 好友发送消息

    任何人都可以帮助我使用 graph api 向 Facebook 好友发送消息 I tried response facebook gt call api me feed post to john message You have a Te
  • Visual Studio:如何显示从基类继承的所有类?

    在 Visual Studio 中 如何显示从基类继承的所有类 例如 在 ASP NET MVC 中有几个 动作结果 类型 它们都继承 实现基类ActionResult 看起来除非你只是 知道 View and Json有效ActionRe
  • GZip 压缩在 IIS 7.5 上不起作用

    我试图在 IIS 下支持静态文件的 GZip 压缩 默认情况下应该启用 但没有 但到目前为止还没有工作 这是下面的部分
  • 如何在 Java 中通过引用传递可变参数

    我正在编写一个方法 该方法接收任意数量的参数并返回修改后的参数 我尝试过使用 varargs 但它不起作用 在这里您可以看到代码的简化版本 public static void main String args String hello h
  • 为 Flexbox 列表设置固定间距

    i noticed that on my firefox the distance between the bottom of the website and the list for links terms about is really
  • 这是聚合吗?

    我有以下代码 public static void main String args Engine engine new Engine This Engine Car b new Car engine b null 这是聚合吗 我一直认为聚
  • pgrep -P,但对于孙子而不仅仅是孩子

    我在用 pgrep P 获取 的子进程 pid 但我实际上也想要一份孙子和曾孙的名单 我该怎么做呢 例如 使用常规编程语言 我们会使用递归来做到这一点 但是使用 bash 呢 也许使用 bash 函数 我已经发布了尝试解决方案 它简短而有效