首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从pstree得到所有pid值

从pstree得到所有pid值
EN

Stack Overflow用户
提问于 2014-12-23 14:24:57
回答 2查看 480关注 0票数 1

我试图从linux中的pstree -pA <PID>输出中获取所有pid。

我正在使用java,并考虑使用正则表达式来完成它。我在下面附上了一个示例输出:

代码语言:javascript
复制
eclipse(45905)---java(45906)-+-{java}(45907)  
                             |-{java}(45908)  
                             |-{java}(45909)  
                             |-{java}(45910)  
                             |-{java}(45911)  

我编写了以下代码:

代码语言:javascript
复制
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 $ ;
}

问题在于进程的名称(即:已执行的文件)是一个数字。它也会抓住他们,这是马车。

你有什么建议来解决吗?或者其他的解决方案?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-12-24 11:29:55

您应该确保pid被大括号包围,此外,您的代码还捕获线程,为了避免线程,您应该忽略其名称周围有{}的进程。

代码语言:javascript
复制
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 $;
}
票数 1
EN

Stack Overflow用户

发布于 2014-12-23 14:39:42

寻找被大括号\((\d+)\)包围的数字,因为进程名被大括号包围,它只会得到PID。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27622300

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档