6

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

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

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

有时我想 ^C 脚本......但这没有成功。据我了解,当 ^C 杀死时mplayer,它会继续sleep,当 ^C 杀死时sleep,它会继续mplayer,而且我从来没有碰巧在两者之间抓住它。据我了解,trap只是永远不会工作。

如何终止脚本?

4

2 回答 2

6

您可以获取 PIDmplayer并在捕获时将 kill 信号发送到 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
于 2015-07-09T10:38:04.860 回答
1

mplayer 在使用 Ctrl-C 停止时返回 1,因此:

mplayer sound.mp3 || break

会做的工作。

这种方法的一个问题是,如果 mplayer 出于其他原因退出 1(即,声音文件的格式错误),它无论如何都会退出,这可能不是所需的行为。

于 2015-07-09T10:40:42.437 回答