0

我有一堆需要检查 CPU 亲和力的进程,所以我得到了这个:

for i in `ps -Fae | grep proc_name| awk '{print $2}'`; do taskset -acp $i;done

但我有一个问题,taskset 也显示了所有子进程的 pid,所以我得到了大量的数字以及它们的 cpu 亲和力。

我想将上面的行通过管道传输到 an 中egrep 'pid1|pid2',以便过滤掉所有子进程。

我试过这个: for i in `ps -Fae | grep proc_name| awk '{print $2}'`; do taskset -acp $i;done | xargs egrep 'ps -Fae | grep proc_name| awk '{print $2}''

但我的 ksh shell 根本不喜欢 awk 括号。

所以我有两个问题:

  1. 可以将taskset更改为仅显示父pid吗?
  2. 我如何写最后一位我只使用父 pid 的地方?
4

2 回答 2

1

如果它是 bash,听起来你在要求这种语法(请参阅https://mywiki.wooledge.org/BashFAQ/001,我不确定 ksh 的等效健壮读取循环语法是什么):

while IFS= read -r i; do
    taskset -acp "$i"
done < <(ps -Fae | awk '/proc_name/{print $2}') |
grep -E 'pid1|pid2'

但这很脆弱,例如,如果pid1作为其他 pid 的子字符串出现。如果您编辑您的问题以提供简洁、可测试的样本输入(即 的输出ps -Fae和相关输出taskset)以及预期输出,那么我们可以提供更多帮助。

于 2021-06-26T13:55:51.410 回答
1

在循环内过滤:

for i in $(ps -Fae | grep proc_name| grep -v grep | awk '{print $2}'); do
   taskset -acp "$i" | grep "$i"
done
于 2021-06-27T21:57:44.090 回答