pgrep no meu script de shell: sem contar o script em si?

3

Este é o comportamento de pgrep no meu script FreeBSD :

luis@Balanceador:~/Temporal$ cat test.sh
#!/usr/bin/env bash
pgrep -fl "test.sh"

luis@Balanceador:~/Temporal$ ./test.sh
luis@Balanceador:~/Temporal$

Nenhuma saída. Isto é: o script em si não é detectado como em execução. Assim como o comportamento da linha de comando de pgrep . Isso está bem para mim.

E este é o caso do Linux (Ubuntu):

luis@Terminus:~/Temporal$ cat test.sh
#!/usr/bin/env bash
pgrep -fl "test.sh"

luis@Terminus:~/Temporal$ ./test.sh
4514 bash
luis@Terminus:~/Temporal$

Como pode ser visto, o script test.sh parece ser detectado como um processo em execução.

Estou desenvolvendo um shell (Bash) script que deve ser capaz de parar e esperar se outra instância dele (mesmo nome) é detectado, e deve funcionar tanto no Linux quanto no FreeBSD, então eu gostaria de homogeneizar o comando pgrep para isso.

Existe alguma maneira de fazer com que ambos se comportem o mesmo ?

Respostas para qualquer derivativo como grep ou ps aceito.

Testado :

A opção -x (exata) da página do manual , mas não funciona com parâmetros nos scripts (ou eu não entendo como fazer isso funcionar). Parâmetros não são importantes para detectar (eles podem ser o que for) neste caso; Eu só preciso detectar o script principal '.sh'.

Outras notas :

  • Por favor, não responda como "Usar bloqueio de arquivo". Eu realmente quero saber sobre a ferramenta pgrep .
por Sopalajo de Arrierez 18.06.2016 / 10:21

2 respostas

3

O pgrep do FreeBSD exclui os ancestrais do processo pgrep , incluindo a instância de script que o executou. O pgrep do Linux não tem um recurso correspondente.

Você pode excluir a instância de script manualmente. O ID do processo a excluir está em $$ . Você precisa ser um pouco cuidadoso para evitar também qualquer subshell: o método mais direto pgrep … | grep -v "^$$ " pode listar o lado direito do canal se pgrep chegar a ele na lista de processos antes de grep ser chamado.

instances=$(pgrep -fl "test.sh")
if [[ "$instances" =~ (.*)$'\n'"$$ "[^$'\n']*$'\n'(.*) ]]; then
  instances=${BASH_REMATCH[1]}$'\n'${BASH_REMATCH[2]}
elif [[ "$instances" =~ (^|.*$'\n')"$$ "[^$'\n']*($|$'\n'.*) ]]; then
  instances=${BASH_REMATCH[1]}${BASH_REMATCH[2]}
fi
    
por 19.06.2016 / 01:51
0

Basta adicionar x aos sinalizadores:

#!/usr/bin/env bash                                                                                                                                                                                                                            
pgrep -flx "pgrep.sh"

Testado no Ubuntu e não imprime nada na saída (se é isso que você quer!).

    
por 18.06.2016 / 10:37

Tags