背景
工作中通过java的Runtime.getRuntime().exec 调用aix的jdmpview命令,这个命令是前台的,就是执行完这个命令之后需要输入其他的命令,然后会显示东西,只有ctrl + c 才能停止。
好吧,表述的不清楚,如图:
点击会出
看到下面还在等待输入,只有ctrl c才能结束。
问题来了Runtime.getRuntime().exec 执行完之后,每次都有一个这个东西常驻这里,一会内存就被消耗完了
aix系统中的top命令是topas
在我的应用的,如果没有杀掉他,一会就满了,机器死机,所以需要每次运行完之后杀掉这个进程
实干家
分析
aix 系统中没有pkill
aix 系统中没有killall
虽然
不过我真的不明白什么意思,但是单单执行 killall
好像可以
sudo kill -9 $(ps -ef|grep 进程名关键字|gawk ‘$0 !~/grep/ {print $2}’ |tr -s ‘\n’ ’ ')
ps -ef|grep jdmpview ‘{print $2}’|xargs kill -9
kill -9 $(ps -ef|grep java|awk ‘{print $2}’)
ps -ef |grep java |awk ‘{print $2}’ | xargs -i kill -9 {}
都试过了,不可以,gawk 不支持,报的错误各不相同
晚上很多网友用的是脚本
其中的脚本片段:
pids=$(ps -ef | grep jdmpview | grep -v grep | awk '{print $2}')
kill -9 $(pidof jdmpview)
可是我通过java调用脚本会不会太麻烦了,一行一行的,java调用linux命令本身就十分的消耗性能。
完工
public static void destoryJdmpview(Process p) throws IOException {
//用这种方式不行,鬼知道为什么,aix
// p = Runtime.getRuntime().exec("ps -ef|grep jdmpview|awk '{print $2}'");
p = Runtime.getRuntime().exec(new String[]{"/bin/sh", "-c","ps -ef|grep jdmpview"});
// p = Runtime.getRuntime().exec("ps aux | grep java");
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
StringBuilder sb = new StringBuilder();
try {
String line;
while ((line = br.readLine()) != null) {
log.debug("line [%s]",line);
sb.append(line.split("\\s+")[2]).append(" ");
}
} catch (IOException e) {
log.error("getResponseList Exception [%s]",e);
}finally {
try {
if (br != null) {
br.close();
}
} catch (Exception e) {
}
}
log.debug("all jdmpview pid [%s] ,will destory them !!!",sb.toString());
p = Runtime.getRuntime().exec("kill -9 "+sb);
}
ps -ef|grep jdmpview|awk ‘{print $2}’ 这种是不行的,必须要p = Runtime.getRuntime().exec(new String[]{"/bin/sh", "-c","ps -ef|grep jdmpview"});
/bin/sh -c 才能获得输出。
之前的ls | egrep "core.*dmp|javacore.*txt|core.*xml"
,也不行,用/bin/sh -c 也不行,目前还不知道为什么,先不去深究了。最后只能避免,用了java的File进行了修改。