【发布时间】:2019-09-19 15:13:46
【问题描述】:
我需要按在 macOS 中具有特定名称的子进程的名称提取并列出所有父进程。我怀疑这将在 Linux 或任何其他 *nix 中正常工作,只要我们对 GNU 工具进行标准化,我们可以通过MacPorts 或Homebrew 使用这些工具。
在这种情况下,我们会说有一个子进程,其中包含许多名为“子名称”的不同实例。有许多这样的“子名称”进程(都具有相同的名称),并且它们的不同集合具有不同的父进程和随后的父进程名称。
因此,在 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,这行不通。我确实尝试过,但它根本不会杀死父进程,只会导致应用程序发疯。父母自己必须被杀死,下面答案中开始的方法似乎是正确的方法,但需要一些调试。