我正在寻找一种自动执行以下操作的方法:
ps -ef
列出所有流程。java
列中包含CMD
的行。root
列中包含UID
的行。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
的答案标记为正确答案,因为它帮助了我一点。
答案 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
pgrep
和pkill
在许多Linux系统上都可用,并且作为* BSD和OS X的“proctools”包的一部分。