Makefile: mata um processo se estiver em execução

5

Eu tenho um makefile como esse, que mata um processo se ele já estiver em execução,

test: client server
    pgrep myserver && killall myserver
    /build/bin/myserver --background
    /build/bin/myclient --server 127.0.0.1

Funciona se eu tiver um myserver iniciado anteriormente. Quando não é, pgrep myserver apenas falha com status diferente de zero, e Makefile considera isso como um erro, por exemplo

pgrep myserver && killall myserver
make: *** [test] Error 1

Alguma sugestão?

    
por daisy 10.06.2018 / 02:39

2 respostas

15

Não combine killall com pgrep . Eles não usam as mesmas regras de correspondência, então o que pgrep mostra pode não ser o que killall mata. Use pkill , que é exatamente o mesmo que pgrep , exceto que mata os processos correspondentes em vez de exibir seus PIDs. Esteja ciente de que, se você chamar pgrep e pkill , haverá uma condição de corrida: no momento em que pkill for executado, alguns processos mostrados por pgrep podem ter sido finalizados e alguns novos processos podem ter sido iniciados. A menos que você se preocupe com os IDs do processo, não faz sentido chamar pgrep ; você pode apenas chamar pkill diretamente.

pkill retorna o status 1 se não encontrar nenhum processo para matar. Adicione - no início do comando, para informar ao make para ignorar esse erro ou altere o comando para pkill myserver || true , que faz exatamente a mesma coisa que pkill myserver , mas sempre retorna um status de sucesso.

test: client server
    pkill myserver || true
    /build/bin/myserver --background
    /build/bin/myclient --server 127.0.0.1
    
por 10.06.2018 / 03:06
5

Você precisa de um ||true para garantir que o primeiro comando sempre retorne sucesso.

Você pode evitar a necessidade de pgrep jogando fora stderr; por exemplo,

test: client server
  killall myserver 2>/dev/null || true
  myserver --background
  myclient --server 127.0.0.1
    
por 10.06.2018 / 02:49

Tags