【问题标题】:ksh cmd one-liner to grep for several PIDs at onceksh cmd one-liner 一次 grep 多个 PID
【发布时间】:2021-06-26 00:44:42
【问题描述】:

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

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

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

我想将上面的行输入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. 可以将任务集更改为仅显示父 pid 吗?
  2. 我如何写最后一位我只 egrep 父 pid?

【问题讨论】:

  • 请编辑您的 Q 以显示您正在使用的操作系统。添加来自uname -srv 的输出。祝你好运。
  • 您的问题准确地说明了为什么您不应再使用`。使用$( ) 在“内部”命令中运行命令。它将清除您的一些引用问题。
  • @Nic3500 我不确定所有(或任何?)ksh 版本都支持$( )

标签: awk ksh ps taskset


【解决方案1】:

在循环内过滤:

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

【讨论】:

    【解决方案2】:

    如果它是 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 的相关输出)加上预期输出,那么我们可以提供更多帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-01
      • 1970-01-01
      • 2016-04-22
      • 2014-03-19
      • 1970-01-01
      • 2017-06-04
      • 1970-01-01
      • 2014-07-31
      相关资源
      最近更新 更多