我试图从linux中的pstree -pA <PID>输出中获取所有pid。
我正在使用java,并考虑使用正则表达式来完成它。我在下面附上了一个示例输出:
eclipse(45905)---java(45906)-+-{java}(45907)
|-{java}(45908)
|-{java}(45909)
|-{java}(45910)
|-{java}(45911) 我编写了以下代码:
private static Pattern PATTERN = Pattern.compile("\\d+");
static List<String> getPidsFromOutput(String output) {
List<String> $ = Lists.newArrayList();
List<String> list = Splitter.on(CharMatcher.anyOf("()\n")).splitToList(output);
for (String string : list) {
Matcher matcher = PATTERN.matcher(string);
if (matcher.matches()) {
$.add(string);
}
}
return $ ;
}问题在于进程的名称(即:已执行的文件)是一个数字。它也会抓住他们,这是马车。
你有什么建议来解决吗?或者其他的解决方案?
发布于 2014-12-24 11:29:55
您应该确保pid被大括号包围,此外,您的代码还捕获线程,为了避免线程,您应该忽略其名称周围有{}的进程。
private static Pattern PATTERN = Pattern.compile(".*[^}]\\((\\d+)\\).*");
private Integer pid;
static Set<String> getPidsFromOutput(String output) {
Set<String> $ = Sets.newHashSet();
List<String> list = Splitter.on(CharMatcher.anyOf("\n")).splitToList(output);
for (String line : list) {
List<String> perProcess = Splitter.on(CharMatcher.anyOf("-")).splitToList(line);
for (String p : perProcess) {
Matcher matcher = PATTERN.matcher(p);
if (matcher.matches()) {
$.add(matcher.group(1));
}
}
}
log.info("pids from pstree: " + $);
return $;
}发布于 2014-12-23 14:39:42
寻找被大括号\((\d+)\)包围的数字,因为进程名被大括号包围,它只会得到PID。
https://stackoverflow.com/questions/27622300
复制相似问题