Linux脚本有选择地杀死进程

时间:2015-02-01 04:37:32

标签: linux bash

我正在寻找一种自动执行以下操作的方法:

  1. 运行ps -ef列出所有流程。
  2. 过滤掉java列中包含CMD的行。
  3. 过滤掉root列中包含UID的行。
  4. 对于每个已过滤的行,获取PID列并运行pargs <PID>
  5. 如果pargs <PID>的输出包含特定字符串XYZ,则问题为kill -9 <PID>
  6. 要根据特定列值过滤掉行,是否有比grep更好的方法?我可以用

    ps -ef | awk '{print $1}' | grep <UID>
    

    然后我丢失了所有其他专栏的信息。我现在最接近的是:

    ps -ef | grep java | grep root | grep -v grep | xargs pargs | ?????
    

    修改

    我能够使用以下脚本解决问题:

    ps -ef | awk '/[j]ava/ && /root/ {print $2}' | while read PID; do
        pargs "$PID" | grep "Args" > /dev/null && kill -9 $PID && echo "$PID : Java process killed!"
    done
    

    anubhavakojiro的回答帮助我到达那里。但由于我只能接受一个答案,我将kojiro的答案标记为正确答案,因为它帮助了我一点。

2 个答案:

答案 0 :(得分:2)

您可以使用grep

来减少所有awk
ps -ef | awk '/[j]ava/ && /root/ {print $1}' | xargs pargs

搜索模式/[j]ava/将从awk的输出跳过此ps进程。

如果您的系统上有pkill,也可以使用{{1}}。

答案 1 :(得分:2)

考虑pgrep

pgrep -U 0 java | while read pid; do
    pargs "$pid" | grep -qF XYZ && kill "$pid"
done

pgreppkill在许多Linux系统上都可用,并且作为* BSD和OS X的“proctools”包的一部分。