2015-07-09 3 views
2

У меня есть сценарий, чьи внутренности сводятся к:CTRL + C, чтобы убить Баш скрипт с ребенком обрабатывает

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

(да, это является немного более значимым, чем выше, но это не имеет значения к проблеме). Несколько экземпляров сценария могут работать одновременно.

Иногда я хочу^C сценарий ... но это не получается. Поскольку я понимаю, когда^C убивает mplayer, он продолжает sleep, а когда^C убивает sleep, он продолжает mplayer, и я никогда не поймаю его между ними. Насколько я понимаю, trap просто никогда не работает.

Как прекратить выполнение сценария?

+0

Хорошо выполненные приложения, которые выходят на SIGINT, должны убить себя с помощью SIGINT, чтобы позволить вызывающему абоненту ответить тоже. См. Http://mywiki.wooledge.org/SignalTrap#Special_Note_On_SIGINT. 'sleep' должен вести себя, надеюсь,' mplayer' тоже. –

ответ

1

Вы можете получить ПИД-код mplayer и после захвата отправить сигнал уничтожения в PID mplayer.

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 
0

MPlayer возвращает 1, когда он остановлен с помощью Ctrl-C так:

mplayer sound.mp3 || break 

будет делать свою работу.

Одна из проблем этого метода заключается в том, что если mplayer выходит 1 по другой причине (т. Е. Звуковой файл имеет плохой формат), он все равно выйдет, и это, возможно, не желаемое поведение.

+0

Извините, я не знаю, что вы имеете в виду. Я думал, что проблема в том, что ctrl-c был захвачен mplayer и никогда не прекращал отцовский процесс ..? – yolenoyer

+0

Я прочитал его еще раз всесторонне, и теперь я вижу, что он не может прекратить процесс отца .. так что все нормально – Noli

+0

Однако ответ Oz123 - более изящное решение – yolenoyer

Смежные вопросы