【问题标题】:How to get all parent process names of a set of child processes (in macOS) from the shell?如何从 shell 获取一组子进程(在 macOS 中)的所有父进程名称?
【发布时间】:2019-09-19 15:13:46
【问题描述】:

我需要按在 macOS 中具有特定名称的子进程的名称提取并列出所有父进程。我怀疑这将在 Linux 或任何其他 *nix 中正常工作,只要我们对 GNU 工具进行标准化,我们可以通过MacPortsHomebrew 使用这些工具。

在这种情况下,我们会说有一个子进程,其中包含许多名为“子名称”的不同实例。有许多这样的“子名称”进程(都具有相同的名称),并且它们的不同集合具有不同的父进程和随后的父进程名称。

因此,在 3 个父进程的示例中,我们将拥有:

kernel_task
└── launchd
    ├── Parent A
    │   ├── Child Name
    │   ├── Child Name
    │   ├── Child Name
    │   ├── Child Name
    │   ├── Child Name
    │   ├── Child Name
    │   └── Child Name
    ├── Parent B
    │   ├── Child Name
    │   ├── Child Name
    │   ├── Child Name
    │   ├── Child Name
    │   ├── Child Name
    │   ├── Child Name
    │   └── Child Name
    └── Parent C
        ├── Child Name
        ├── Child Name
        ├── Child Name
        ├── Child Name
        ├── Child Name
        ├── Child Name
        └── Child Name

我希望能够像这样执行脚本:

$ get_parent_names_of_child "Child Name" 然后会打印:

Parent A
Parent B
Parent C

(然后我可能会通过 xargs 或其他方式将其传递给 killall。)

如何做到这一点?

【问题讨论】:

  • 子进程可能属于同一个进程组。你考虑过killall -g吗?
  • @xhienne 你知道如何在 macOS 上为进程找到pgid 吗? -g 不存在 killall 那里。此外,这些进程都是在完全隔离的实例中完全独立生成的,所以我怀疑它们是否具有相同的 pgid...
  • @ylluminate 使用 killall,不需要有它的 PGID:你用进程名称喂它,所以一个孩子的名字就足够了。我不知道killall的MacOS版本。
  • 所以没有@xhienne,这行不通。我确实尝试过,但它根本不会杀死父进程,只会导致应用程序发疯。父母自己必须被杀死,下面答案中开始的方法似乎是正确的方法,但需要一些调试。

标签: bash macos zsh


【解决方案1】:

要获取名为“ChildProcess”的进程的父 PID,您可以使用以下脚本(进行一些修改)。要获取 PPID 的完整列表,您可以在输出有效或 PID != 0 时将脚本的输出作为输入通过管道传输到脚本中?

#!/bin/bash

# usage: ./scriptName "ChildProcessName"

pidName=$1

childProcessIDs=($(pidof ${pidName}))

declare -a parentProcessIDs=()

for(( i=0; i<=${#childProcessIDs[@]}; i++ ))
do
    anotherParent=$(ps -p ${pid:-$$} -o ppid=)
    if [ ! -z "$anotherParent" ]
    then
        parentProcessIDs+=($(printf "%s" ${anotherParent}))
    fi
done

ppids=($(echo "${parentProcessIDs[@]}" | tr ' ' '\n' | sort -u))

# Show results
for(( i=0; i<=${#ppids[@]}; i++ ))
do
    if [ ! -z "${ppids[i]}" ]
    then
        echo "${ppids[i]}"
    fi
done

【讨论】:

  • 伟大的开始。因此,在 macOS 上,pidof 缺失,因此有 2 个选项:1)在开头附近添加类似 pidof () { ps -Ac | egrep $@ | awk '{print $1}'; } 的内容或 2)sudo port install pidof。在此之后,我发现它只返回一个 pid,它是我正在运行的 zsh 本身的 pid……目前正在运行 533 个“子名”,其中有 7 个“子名”的实际父母。我也可以运行get_parent_names_of_child.sh ANYTHING,它总是会返回当前zsh实例的pid...
猜你喜欢
  • 2013-07-18
  • 2012-10-02
  • 2012-03-14
  • 1970-01-01
  • 2015-07-08
  • 2011-07-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多