Pgrep retorna múltiplos PIDs

7

Meu script aceita um nome de processo como uma entrada e o mata. Eu tentei usar o pgrep, mas ele está retornando dois PIDs, um para o processo que está sendo executado e um para o script que aceita o nome do processo como entrada, então estou preso! Eu tentei usar a opção pgrep -fo , mas isso também não ajudou. Quaisquer sugestões seriam úteis. Este é o meu script

#!/bin/bash
ProcessName=$1

pID= pgrep -fl $ProcessName

echo $pID

Então, quando invoco o script, ele retorna dois PIDs:

bash-3.00$ ./dynamic_values.sh test-Process

10534 /xxx/xxo/xxx/xxe --run --propFile /application/test/test-Process_Archive.tra --innerProcess
23401 /bin/bash ./dynamic_values.sh test-Process

Eu esperava apenas 10534, mas também peguei o script. Versão do SO apenas no caso:

bash-3.00$ uname -a
Linux xxxxxx 2.6.9-67.0.1.
    
por greenhorn 29.08.2012 / 05:32

4 respostas

3

Eu tive que enfrentar esse mesmo problema há algumas semanas. pgrep e pkill suportam expressões regulares estendidas, por isso é uma simples questão de obter o regexp correto.

Este é o seu script com o regexp que usei.

#!/bin/bash
ProcessName=$1

pID= pgrep -fl "^(/.*)?${ProcessName}\s"

echo $pID

Embora o uso de pkill (como Caleb sugeriu) seja melhor.

pkill -fl "^(/.*)?${ProcessName}\s"

Você ainda pode precisar ajustar o regexp para obter os resultados desejados para o seu caso de uso e como o programa está sendo executado.

Agora, se houver vários processos em execução com esse nome, eles serão, obviamente, eliminados. Se você quiser evitar que você pode usar -o para matar apenas o mais antigo processo de correspondência ou -n para matar apenas o mais recente . Se você quiser apenas um, mas não o mais antigo ou o mais novo, provavelmente não deveria estar usando p(kill|grep) .

    
por 29.08.2012 / 17:37
0

se você excluir o #! / bin / bash, ele não irá bifurcar outro processo para o script, mas você perderá a escolha de com qual shell ele será executado. bash é padrão o suficiente e os que são smiler devem ser capazes de rodar isso.

não tenho certeza se isso eliminará o segundo ID do processo.

Eu entendo que isso não está completo, mas é tarde e eu tenho que trabalhar na manhã, mas isso "deve" funcionar como uma solução rápida.

    
por 29.08.2012 / 05:49
0

Não usaria

| grep -v $$

para excluir seu processo da ajuda da lista?

    
por 29.08.2012 / 10:24
0
#!/bin/bash

ProcessName=$1

pID='pgrep -fl $ProcessName'

echo "$pID" | grep -v  "^$$"
    
por 29.08.2012 / 10:44