Я работаю над проектом, в котором мне нужно 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}'
может добиться цели.
Проблема, я не знаю, куда поместить ее. Или если это там различный/лучше способ сделать это.
Другая идея состоит в том, чтобы уничтожить последние процессы один сразу, но останавливающийся на самом первом.
Любые идеи ценятся.
Заранее спасибо.
Вы можете попробовать:
pgrep mplayer | grep -vf player.pid | xargs kill -9
Примечания:
pgrep
- это инструмент для поиска информации о процессе. Он даже поддерживает отрицание совпадений и использование файлов PID, но, к сожалению, я не смог найти способ выборочно отрицать совпадения. grep
из файла с помощью -f
, а отрицательные совпадения с -v
xargs
преобразуют входные данные в аргументы, поэтому вам не нужно использовать подстановку команд