3 votes

Tuer toutes les autres instances d'un processus en cours, sauf la toute première.

Je travaille sur un projet dans lequel je dois mplayer pour exécuter plusieurs instances afin de créer un mixage voix-off-musique en temps réel à partir de deux fichiers. Ainsi, la musique est constamment jouée à 90% du volume (représentée par "M" dans la ligne de temps suivante) et à certains moments, nous baissons le volume ("m") afin de placer la voix ("V") sur la musique, après quoi nous ramenons la musique à 90% lorsque l'échantillon de voix se termine.

CALENDRIER (minutes)

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

Tout fonctionne très bien jusqu'à présent. Mais, pour une raison quelconque, plusieurs fois la deuxième mplayer L'instance termine la lecture de la voix-off mais le processus reste actif et ne se termine jamais.

La réponse se trouve ici : Tuer tous les processus sauf celui qui exécute le script. ne fonctionne pas pour 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 TOUTES les instances de mplayer et j'ai besoin de garder le premier constamment en musique.

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

Solution attendue

J'enregistre 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 qui est enregistré dans le fichier player.pid. Ainsi, 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 s'il y a une façon différente/meilleure de le faire.

Une autre idée est de tuer les derniers processus un par un, mais en s'arrêtant sur le tout premier.

Toute idée est la bienvenue.

Merci d'avance.

3voto

muru Points 180007

Vous pouvez essayer :

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

Notes :

  • pgrep es le site outil permettant de rechercher des informations sur les processus. Il prend même en charge l'annulation des correspondances et l'utilisation des fichiers PID, mais malheureusement je n'ai pas trouvé de moyen d'annuler sélectivement les correspondances.
  • Puisque vous avez le fichier, il suffit de grep lu dans le fichier avec -f et nier les correspondances avec -v
  • xargs convertit les entrées en arguments, de sorte que vous n'avez pas besoin d'utiliser la subtitution des commandes.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X