我正在做一个项目,我需要在其中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
是查找过程信息的工具。它甚至支持否定匹配和使用 PID 文件,但不幸的是我无法找到一种选择性否定匹配的方法。grep
从文件中读取-f
,并否定匹配-v
xargs
将输入转换为参数,因此您不需要使用命令替代