Identificando exclusivamente processos java com o mesmo nome

4

Eu tenho dois processos java que são executados usando o mesmo nome de arquivo, MyApp.jar (por exemplo).

/usr/java/latest/bin/java -jar MyApp.jar

Esses frascos existem em lugares diferentes e usam diferentes configurações.

Eu quero ser capaz de matar um processo, mas não sei distinguir entre os dois. Eu executo:

 ps aux | grep [M]yApp.jar

E obtenha:

admin    21509  0.8  0.1 1199908 20484 ?       Sl   08:21   0:00 /usr/java/latest/bin/java -jar MyApp.jar
admin    21585  6.7  0.1 1199764 20084 ?       Sl   08:21   0:00 

Pensei em criar o processo com algum parâmetro fictício para poder distingui-los:

/usr/java/latest/bin/java -jar MyApp.jar MyAppTheFirst

e

/usr/java/latest/bin/java -jar MyApp.jar MyAppTheSecond

Mas isso parece um pouco errado para mim. Existe uma maneira melhor?

    
por Peter Wood 17.04.2013 / 09:38

3 respostas

3

Primeiro, por que você quer matar algum deles? Se um processo está usando muitos recursos, você pode simplesmente obter o PID em top :

top -n 1

Se eles precisarem ser reiniciados periodicamente ou reagirem a estímulos externos, use o gerenciamento de processos :

while true
do
    java -jar MyApp.jar &
    my_app_pid=$!
    while ! whatever_makes_me_think_my_app_should_be_restarted
    do
        sleep 60
    done
    kill $my_app_pid
done
    
por 17.04.2013 / 12:52
2

A alteração de parâmetros faz diferença no aplicativo, portanto, não é a melhor ideia. Você pode alterar $ 0, ou seja, o próprio nome do programa. A maioria dos programas não se importa com isso, mas alguns mudam seu comportamento com base nisso (por exemplo, se você pode chamar o mesmo binário por nomes diferentes, como IIRC com mtools e busybox):

bash -c 'exec -a mysleep sleep 100'
ps aux | grep sleep
hl       20818  0.0  0.0   5732   576 pts/10   S+   10:01   0:00 mysleep 100

ou você usa o ambiente:

bash -c 'IDSTRING=PROC1 exec sleep 100'
PID=20936
tr '
bash -c 'exec -a mysleep sleep 100'
ps aux | grep sleep
hl       20818  0.0  0.0   5732   576 pts/10   S+   10:01   0:00 mysleep 100
' '\n' </proc/"$PID"/environ | grep IDSTRING IDSTRING=PROC1

ou você inicia o processo com um script de wrapper que grava o PID e informações adicionais (para diferenciar os processos) em um arquivo de log.

    
por 17.04.2013 / 10:15
-5

A única maneira que pode ajudar é determinar o maior número de PID. o maior é o processo mais tarde executado. MAS NÃO SEMPRE

    
por 17.04.2013 / 10:21

Tags