ctrl + c用子进程杀死bash脚本

时间:2015-07-09 10:32:28

标签: bash

我有一个脚本,内部归结为:

trap "exit" SIGINT SIGTERM
while :
do
    mplayer sound.mp3
    sleep 3
done

(是的, 比上面的更有意义,但这与问题无关)。脚本的几个实例可能同时运行。

有时候我想要^ C脚本......但是这没有成功。据我了解,当^ C杀死mplayer时,它会继续sleep,当^ C杀死sleep时,它会继续mplayer,而我永远不会碰到它之间。据我了解,trap永远不会奏效。

如何终止脚本?

2 个答案:

答案 0 :(得分:1)

你可以获得mplayer的PID,并在捕获时将杀戮信号发送到mplayer的PID。

function clean_up {

    # Perform program exit housekeeping
    KILL $MPLAYER_PID
    exit
}

trap clean_up SIGHUP SIGINT SIGTERM
mplayer sound.mp3 &
MPLAYER_PID=$!
wait $MPLAYER_PID

答案 1 :(得分:0)

mplayer在使用Ctrl-C停止时返回1,所以:

mplayer sound.mp3 || break

将完成这项工作。

这种方法的一个问题是,如果mplayer因为另一个原因退出1(即声音文件的格式不正确),它将会退出,这可能不是所希望的行为。