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

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

要根据特定的列值过滤出行,是否有比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

anubhava和kojiro的答案都帮助我到达了那里.但是,由于我只能接受一个答案,因此我将kojiro的答案标记为正确的答案,因为它帮助了我更多.

解决方法:

考虑pgrep:

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

pgrep和pkill在许多Linux系统上可用,并且是* BSD和OS X的“ proctools”软件包的一部分.

标签: bash, linux

相关文章推荐

添加新评论,含*的栏目为必填