Я пытаюсь получить все pid из pstree -pA <PID>
в linux.
Я работаю в 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 $ ;
}
Проблема заключается в том, что их имена (т.е. Исполняемый файл) являются числом. он также их поймает, и это будет ошибкой.
У вас есть какое-то предложение исправить это? или любое другое решение?
вы должны убедиться, что 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 $;
}
Найдите числа, которые окружены фигурными скобками \((\d+)\)
так как имена процессов окружены фигурными фигурными скобками, он получит только PID