Encontre o id do processo de um aplicativo java em um script bash (para ver se o aplicativo de destino já está em execução)

4

Eu sei que há um milhão de perguntas sobre como obter o ID do processo, mas este parece ser único. O Google não me deu a resposta, então espero que o stackexhange ajude ao invés de fechar essa questão.

Quando o Java está envolvido, parece mais complicado encontrar um ID de processo (pgrep não funciona afaik).

Além disso, preciso automatizar isso em um script bash. Um problema que eu encontrei é que quando eu uso ps aux | grep o processo do grep sempre aparece, então manipular os resultados em um script bash simples não é trivial o suficiente para eu descobrir uma boa solução por conta própria habilidades bash).

Algumas coisas que tentei:

Exemplo 1 - isso retorna um processo, mesmo que não haja aplicativo com esse nome:

$ ps aux | grep -i anythingnotreal
user2   3040  0.0  0.0   4640   856 pts/3    S+   18:17   0:00 grep --color=auto -i anythingnotreal

Exemplo 2 - isto não retorna nada mesmo que "java_app" esteja atualmente em execução:

$ pgrep java_app

Não retorna nada. No entanto, aqui está a prova de que "java_app" está em execução:

$ ps aux | grep java_app
tester2   2880  0.7  2.8 733196 58444 ?        Sl   18:02   0:07 java -jar /opt/java_app2/my_java_app.jar
tester2   3058  0.0  0.0   4644   844 pts/3    S+   18:19   0:00 grep --color=auto java_app

O que eu preciso é de uma solução que eu possa conectar em um script bash que me dirá se o aplicativo java de interesse (para o qual eu conheço o nome e o caminho do arquivo jar) está atualmente em execução. (Se estiver em execução, preciso pedir ao usuário para fechá-lo antes que meu script continue).

    
por MountainX 30.06.2013 / 00:26

3 respostas

4

Por padrão, pgrep corresponde apenas ao comando, não aos argumentos. Para corresponder à linha de comando completa, você precisa da opção -f .

$ pgrep -f java_app

Na página de manual do pgrep:

-f The pattern is normally only matched against the process name. When -f is set, the full command line is used

    
por 30.06.2013 / 00:29
0

Você pode usar pidof java para descobrir quais processos Java estão sendo executados e, em seguida, obter os detalhes de cada processo, como ps -p $PID -o pid,vsz=MEMORY -o user,group=GROUP -o comm,args=ARGS , para determinar se o aplicativo de destino está sendo executado e se precisa pedir ao usuário para fechar ou continuar.

    
por 30.06.2013 / 01:05
0

Você pode usar o utilitário jcmd que faz parte do JDK. Ele lista apenas os processos Java atualmente em execução, então tudo que você precisa fazer é grep para java_app

jcmd | grep java_app | cut -d " " -f 1
    
por 29.09.2018 / 22:02