我编写了一个脚本,使用 ffplay 直接在终端上播放音频。现在,在执行该脚本后,我无法停止声音,除非通过终端或系统监视器专门将其关闭。我试图做的是指定一个参数,比如audio.sh stop
关闭 PID 并停止音频。但我无法通过简单地
PID=$$
elif [[ $# == 1 ]] && [[ $1 == 'stop' ]]; then
kill ${PID}
我在这里遇到了一个问题,在使用 stop 参数运行此脚本后,它将创建另一个脚本实例,然后立即将其终止。那么,有什么办法可以做到这一点吗?这是我的完整代码。
1 folder=<folder path>
2
3 PID=$$
4
5 if [[ $# == 0 ]]; then
6 RANDOM=$$
7 for i in `seq 1`
8 do
9 R=$(($(($RANDOM%53))+1))
10 file=${folder}${R}.mp3
11 ffplay -nodisp -autoexit ${file} >/dev/null 2>&1 &
12 done
13 elif [[ $# == 1 ]]; then
14 file=${folder}${1}.mp3
15 ffplay -nodisp -autoexit ${file} >/dev/null 2>&1 &
16 elif [[ $# == 1 ]] && [[ $1 == 'stop' ]]; then
17 kill ${PID}
18 fi
答案1
要终止所有实例ffplay
,请替换:
kill ${PID}
和:
pkill ffplay
这将使您的生活变得更加简单。
答案2
因此,正如微软使用pkill
,将一次性杀死 的所有实例ffplay
。我发现一种逐个杀死最新实例的方法,方法是使用pidof ffplay
,这将返回当前正在运行的所有 PID ffplay
(最新的优先)。因此,使用 命令,pidof ffplay | awk '{print $1}'
我们可以提取 的最新实例的 PIDffplay
并将其杀死。
编辑 1:正如@iyrin 在评论中所建议的,我们可以使用它pidof -s ffplay
直接获取 ffplay 最新实例的 PID,而无需使用管道。