如何在脚本执行后终止程序?

如何在脚本执行后终止程序?

我编写了一个脚本,使用 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,而无需使用管道。

相关内容