Eu tenho um makefile como este, que mata um processo se 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 myserver
iniciado anteriormente. Quando não é, pgrep myserver
apenas falha com status diferente de zero, e o Makefile o considera um erro, por exemplo
pgrep myserver && killall myserver
make: *** [test] Error 1
Alguma sugestão?
Não combine
killall
compgrep
. Eles não usam as mesmas regras de correspondência, então o quepgrep
mostra pode não ser o quekillall
mata. Usepkill
, que é exatamente o mesmo que,pgrep
exceto que ele mata os processos correspondentes em vez de exibir seus PIDs. Esteja ciente de que, se você chamar ambospgrep
epkill
, haverá uma condição de corrida: no momento dapkill
execução, alguns processos mostrados porpgrep
podem ter terminado e alguns novos processos podem ter sido iniciados. A menos que você se importe com os IDs do processo, não faz sentido chamarpgrep
; você pode simplesmente ligarpkill
diretamente.pkill
retorna o status 1 se não encontrar nenhum processo para matar. Adicione-
no início do comando, para dizer ao make para ignorar este erro, ou altere o comando para opkill myserver || true
qual faz exatamente a mesma coisa que,pkill myserver
mas sempre retorna um status de sucesso.Você precisa de um
||true
para garantir que o primeiro comando sempre retorne com sucesso.Você pode evitar a necessidade
pgrep
jogando fora stderr; por exemploSe você precisar ignorar o resultado de um comando em Make , você deve usar o
-
operador assim:Dessa forma , o Make saberá que você não se importa se
pkill
falhar e não precisará usar||
desnecessariamente.Você também pode evitar imprimir o comando e a saída
@-
assim: