Mate todas as outras instâncias de um processo em execução, exceto a primeira.

3

Estou trabalhando em um projeto no qual preciso que mplayer execute várias instâncias para criar mixagem em tempo real de música sobre música a partir de dois arquivos. Então, a música está tocando constantemente em 90% do volume (representado como "M" na próxima linha do tempo) e em certos momentos nós abaixamos o volume ("m") para colocar a voz ("V") sobre a música, depois que vamos devolver a música para 90% quando a amostra de voz terminar.

LINHA DO TEMPO (minutos)

0===========1===========2===========3===========4===========...
_____________VVVVVVVV__________VVVVVVVVVVVVVV__________VVVVV...
MMMMMMMMMMMMMmmmmmmmmMMMMMMMMMMmmmmmmmmmmmmmmMMMMMMMMMMmmmmm...

Tudo está funcionando muito bem até agora. Mas, por algum motivo, muitas vezes a segunda mplayer instance finaliza a reprodução de voice-off, mas o processo ainda permanece ativo e nunca terminará.

A resposta fornecida aqui: Mate todos os processos, exceto o um executando o script não está funcionando para este caso.

Eu também tentei a resposta aceita sobre esta questão: link mas isso matará TODAS as instâncias de mplayer e eu preciso manter o primeiro tocando constantemente música.

Nesta página link eles reproduzem uma maneira de matar todos os processos iniciados por um aplicativo. O que é realmente útil para este caso, mas isso também matará todas as instâncias de mplayer .

Solução esperada

Estou salvando o PID do music player com:

mplayer -shuffle -playlist playlist.m3u </dev/null >/dev/null 2>&1 & echo $! > player.pid

Com esse número PID, eu gostaria de usar a solução da última página dada para matar todos os processos EXCETO aquele salvo no arquivo player.pid. Então, colocando cat player.pid no meio de

kill -9 'ps -ef | grep oraxpo | grep -v grep | awk '{print $2}' 

pode fazer o truque.

O problema é que não sei onde colocá-lo. Ou se existe uma maneira diferente / melhor de fazê-lo?

Outra ideia é matar os últimos processos um de cada vez, mas parando no primeiro.

Qualquer ideia é apreciada.

Obrigado antecipadamente.

    
por Geppettvs D'Constanzo 20.11.2016 / 17:01

1 resposta

3

Você pode tentar:

pgrep mplayer | grep -vf player.pid | xargs kill -9

Notas:

  • pgrep é a ferramenta para procurar informações sobre o processo. Ele ainda suporta negar correspondências e usar arquivos PID, mas infelizmente não consegui descobrir uma maneira de negar seletivamente as correspondências.
  • Como você tem o arquivo, basta grep ler o arquivo com -f e negar correspondências com -v
  • xargs converte a entrada em argumentos, portanto, você não precisa usar a subtituição de comando
por muru 20.11.2016 / 17:19