Убейте все остальные экземпляры запущенного процесса, кроме самого первого

Я работаю над проектом, в котором мне нужно 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}' 

может сделать свое дело.

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

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

Любые идеи приветствуются.

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

1 ответ

Решение

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

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

Заметки:

  • pgrep это инструмент для поиска информации о процессе. Он даже поддерживает отрицание совпадений и использование файлов PID, но, к сожалению, я не смог найти способ выборочно отрицать совпадения.
  • Так как у вас есть файл, просто grep читать из файла с -f и отрицать совпадения с -v
  • xargs преобразует ввод в аргументы, поэтому вам не нужно использовать подстановку команд
Другие вопросы по тегам