Уничтожьте все другие экземпляры рабочего процесса кроме самого первого

Я работаю над проектом, в котором мне нужно mplayer выполнять несколько экземпляров для создания речи по музыке смешивание в реальном времени из двух файлов. Так, музыка постоянно играет в 90%-м объеме (представленный как "M" в следующей временной шкале), и в определенные моменты мы понижаем объем ("m") для размещения речи ("V") над музыкой, после которой мы возвратим музыку 90%, когда речевой образец закончится.

ВРЕМЕННАЯ ШКАЛА (Минуты)

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

Все работает довольно прекрасное до сих пор. Но, по некоторым причинам, много раз второе mplayer экземпляр заканчивает речь - от воспроизведения, но процесс все еще остается активным и никогда не будет заканчиваться.

Ответ предоставлен прямо здесь: Уничтожьте все процессы кроме того, запускающего скрипт, не работает на этот случай.

Я также попробовал принятый ответ по этому вопросу: https://unix.stackexchange.com/questions/50555/kill-many-instances-of-a-running-process-with-one-command, но это уничтожит КАЖДЫЙ экземпляр mplayer и я должен сохранить первый, постоянно играющий музыку.

На этой странице http://www.oracleflash.com/20/How-to-kill-all-processes-with-one-command-in-Linux.html они воспроизводят способ Уничтожить все процессы, инициируемые приложением. Который действительно полезен для этого случая, но это также уничтожит все экземпляры mplayer.

Ожидаемое решение

Я сохраняю PID аудиоплеера с:

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

С тем, что число PID, я хотел бы использовать решение последней данной страницы для уничтожения всех процессов КРОМЕ того, сохраненного в player.pid файле. Так, размещение cat player.pid посреди

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

может добиться цели.

Проблема, я не знаю, куда поместить ее. Или если это там различный/лучше способ сделать это.

Другая идея состоит в том, чтобы уничтожить последние процессы один сразу, но останавливающийся на самом первом.

Любые идеи ценятся.

Заранее спасибо.

3
задан 13 April 2017 в 15:37

1 ответ

Вы можете попробовать:

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

Примечания:

  • pgrep - это инструмент для поиска информации о процессе. Он даже поддерживает отрицание совпадений и использование файлов PID, но, к сожалению, я не смог найти способ выборочно отрицать совпадения.
  • Поскольку у вас есть файл, просто прочитайте grep из файла с помощью -f, а отрицательные совпадения с -v
  • xargs преобразуют входные данные в аргументы, поэтому вам не нужно использовать подстановку команд
3
ответ дан 1 December 2019 в 16:20

Другие вопросы по тегам:

Похожие вопросы: