Linux 选择性终止进程的脚本

Linux Script to selectively kill processes

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

  1. 运行 ps -ef 列出所有进程。
  2. 过滤掉 CMD 列中包含 java 的那些行。
  3. 过滤掉 UID 列中包含 root 的那些行。
  4. 对于过滤后的每个行,获取 PID 列和 运行 pargs <PID>
  5. 如果 pargs <PID> 的输出包含特定字符串 XYZ,则发出 kill -9 <PID> 命令。

要根据特定列值过滤掉行,有没有比grep更好的方法?我可以使用

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

但是我丢失了所有其他列的信息。我现在最接近的是:

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

编辑

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

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

anubhavakojiro 的回答都帮助我达到了目的。但由于我只能接受一个答案,所以我将 kojiro 的答案标记为正确答案,因为它对我的帮助更大。

您可以使用 awk:

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

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

您也可以使用 pkill(如果您的系统可用)。

考虑 pgrep:

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

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