Убейте все остальные экземпляры запущенного процесса, кроме самого первого
Я работаю над проектом, в котором мне нужно 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}'
может сделать свое дело.
Проблема в том, что я не знаю, где это разместить. Или, если есть другой / лучший способ сделать это.
Другая идея состоит в том, чтобы убить последние процессы по одному, но остановимся на самом первом.
Любые идеи приветствуются.
Заранее спасибо.
2 ответа
Ты можешь попробовать:
pgrep mplayer | grep -vf player.pid | xargs kill -9
Заметки:
pgrep
это инструмент для поиска информации о процессе. Он даже поддерживает отрицание совпадений и использование файлов PID, но, к сожалению, я не смог найти способ выборочно отрицать совпадения.- Так как у вас есть файл, просто
grep
читать из файла с-f
и отрицать совпадения с-v
xargs
преобразует ввод в аргументы, поэтому вам не нужно использовать подстановку команд
Самый простой совет
Просто откройтеhtop
и иди кsearch
а потом искатьmplayer
а затем просто нажмитеnext
и нажмите наkill
и это сделано. Так просто, как, что.
Команда установки htop
- Fedora/Red Hat Enterprise
dnf install htop
- Убунту/Дебаин
sudo apt install htop
- Арка
sudo pacman -S htop
Надеюсь, это сработает для вас.
Дайте мне голос, если это так.