web-dev-qa-db-fra.com

Tuez toutes les autres instances d'un processus en cours sauf le tout premier

Je travaille sur un projet dans lequel j'ai besoin de mplayer pour exécuter plusieurs instances afin de créer un mixage en temps réel de voix sur de la musique à partir de deux fichiers. Ainsi, la musique joue en permanence à 90% du volume (représenté par "M" dans la timeline suivante) et à certains moments, nous baissons le volume ("m") afin de placer la voix ("V") sur la musique, après nous allons retourner la musique à 90% lorsque l'échantillon de voix se termine.

CALENDRIER (Minutes)

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

Tout fonctionne assez bien jusqu'à présent. Mais, pour une raison quelconque, souvent, la deuxième instance mplayer termine la lecture avec désactivation de la voix, mais le processus reste toujours actif et ne se termine jamais.

La réponse fournie ici: Kill tous les processus sauf celui qui exécute le script ne fonctionne pas dans ce cas.

J'ai également essayé la réponse acceptée sur cette question: https://unix.stackexchange.com/questions/50555/kill-many-instances-of-a-running-process-with-one-command = mais cela va tuer CHAQUE instance de mplayer et je dois garder la première en continuellement jouer de la musique.

Dans cette page http://www.oracleflash.com/20/How-to-kill-all-processes-with-one-command-in-Linux.html ils reproduisent le moyen de tout tuer processus initiés par une application. Ce qui est vraiment utile dans ce cas, mais cela va également tuer toutes les instances de mplayer.

Solution attendue

Je sauvegarde le PID du lecteur de musique avec:

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

Avec ce numéro PID, j'aimerais utiliser la solution de la dernière page donnée afin de tuer tous les processus SAUF _ ( celui enregistré dans le lecteur fichier .pid. Donc, en plaçant cat player.pid au milieu de

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

peut faire l'affaire.

Le problème est que je ne sais pas où le placer. Ou si y a-t-il un moyen différent/meilleur de le faire?.

Une autre idée est de tuer les derniers processus un à la fois mais en s’arrêtant le tout premier.

Toutes les idées sont appréciées.

Merci d'avance.

3

Tu peux essayer:

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

Remarques:

  • pgrep est the l'outil de recherche d'informations de processus. Il prend même en charge les correspondances négatives et l’utilisation de fichiers PID, mais malheureusement, je n’étais pas en mesure de trouver un moyen de nier sélectivement les correspondances.
  • Puisque vous avez le fichier, il suffit de lire grep à partir du fichier avec -f et d’annuler les correspondances avec -v.
  • xargs convertit l'entrée en arguments, vous n'avez donc pas besoin d'utiliser la substitution de commande
3
muru