时间线(分钟)

时间线(分钟)

我正在做一个项目,需要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将输入转换为参数,因此您不需要使用命令替换

答案2

最简单的提示

只需打开htop并转到search,然后搜索mplayer,然后点击nextkill就可以了。就这么简单。

Htop 安装命令

  • Fedora/Red Hat 企业版
    dnf install htop
  • Ubuntu/Debain
    sudo apt install htop

  • sudo pacman -S htop

希望它对你有用。
如果有用的话请给我点赞。

相关内容