2015-01-26 3 views
3

Я пытаюсь создать метод в Groovy, чтобы получить идентификатор процесса приложения. Я в настоящее время на данном этапе:Получение PID для процесса с использованием Groovy

String getProcessIdFor(String program) { 
    def buffer = new StringBuffer() 

    Process commandOne = 'ps -A'.execute() 
    Process commandTwo = "grep -m1 '${program}'".execute() 
    Process commandThree = "awk '{print \$1}'".execute() 

    Process process = commandOne | commandTwo | commandThree 
    process.waitForProcessOutput(buffer, buffer) 

    return buffer.toString() 
} 

Но это дает мне:

Exception in thread "Thread-1" groovy.lang.GroovyRuntimeException: exception while reading process stream 
awk: syntax error at source line 1 
at org.codehaus.groovy.runtime.ProcessGroovyMethods$3.run(ProcessGroovyMethods.java:402) 
context is 
at java.lang.Thread.run(Thread.java:745) 
>>> ' <<< 
missing } 
Caused by: java.io.IOException: Stream closed 
awk: bailing out at source line 1 
at java.lang.ProcessBuilder$NullOutputStream.write(ProcessBuilder.java:434) 
at java.io.OutputStream.write(OutputStream.java:116) 
at java.io.BufferedOutputStream.write(BufferedOutputStream.java:122) 
at java.io.BufferedOutputStream.write(BufferedOutputStream.java:122) 
at org.codehaus.groovy.runtime.ProcessGroovyMethods$3.run(ProcessGroovyMethods.java:399) 
... 1 more 

Process finished with exit code 0 

Похоже, он изо всех сил по команде awk, но я не могу показаться, чтобы выяснить, где я идет не так. Есть идеи?

+0

ли ' 'AWK {напечатать \ $ 1}'. Execute()' работать? Я бы просто использовал findAll и разделил вместо того, чтобы трафик между тремя процессами –

+0

или '['awk', '{print $ 1}']. Execute()'? – cfrick

+0

Есть несколько хороших решений в этой ссылке, а некоторые из них независимы от платформы - http://stackoverflow.com/questions/35842/how-can-a-java-program-get-its-own-process-id – Rao

ответ

2

Альтернативным (как выход из ps не должны блокировать любые буферы)

Integer getPid(processName) { 
    'ps -A'.execute() 
      .text 
      .split('\n') 
      .find { it.contains processName }?.split()?.first() as Integer 
} 

println getPid('groovyconsole') 
+0

Эта работа как шарм - спасибо! Вы официально в моем списке героев SO^_ ^ –

1

on linux/bsd/... pgrep поможет найти процесс работы намного проще. например

def b = new StringBuffer() 
def p = 'pgrep zsh'.execute() // does a zsh run? 
p.waitForProcessOutput(b,b) 
assert b // any output? there is a zsh running 
assert b.split().first().toInteger() > 0 // split, take first and cast to integer for the first pid returned 

b = new StringBuffer() 
p = 'pgrep nuffin'.execute() // use `-f` to use the "whole" command line 
p.waitForProcessOutput(b,b) 
assert !b // empty string? process not running 
Смежные вопросы