Скрипт Bash: не может правильно обрабатывать SIGTSTP

У меня есть скрипт bash, который монтирует и размонтирует устройство, которое выполняет некоторые операции чтения между ними. Поскольку устройство работает очень медленно, выполнение сценария занимает около 15 секунд (монтирование занимает не менее 5-6 секунд). Поскольку оставление этого устройства установленным может вызвать другие проблемы, я неЯ не хочу, чтобы этот сценарий был прерван.

Сказав это, я могу правильно обработать SIGINT (Ctrl + c), но когда я пытаюсь обработать SIGTSTP (Ctrl + z), скрипт зависает. Это означает, что сигнал перехвачен, но обработчик неТ беги.

#!/bin/sh
cleanup()
{
    # Don't worry about unmounting yet. Just checking if trap works.
    echo "Quitting..." > /dev/tty
    exit 0
}
trap 'cleanup' SIGTSTP
...

Я вручную должен отправить сигнал KILL процессу. Есть идеи, почему это происходит и как я могу это исправить?

Ответы на вопрос(1)

Решение Вопроса

пока не завершится текущий выполняющийся процесс. (по крайней мере, это поведение bash 3.00.15). Если вы отправляете SIGINT через ^ c, он отправляется всем процессам в группе процессов переднего плана; если программа, выполняющаяся в данный момент, получает ее и завершает работу, то bash может выполнить прерывание. Аналогично с SIGTSTP через ^ z; bash получает сигнал, но не выполняет прерывание до тех пор, пока не завершится выполняемая программа, чего он не делает, если принимает поведение по умолчанию и приостанавливается. Попробуйте заменить... с простымread f и обратите внимание, что ловушка срабатывает немедленно.

 Ram10 окт. 2012 г., 19:42
Это так много смысла. Похоже, если все исполняемые вами скрипты также не обрабатывают ^ z так, как вы это делаете, невозможно правильно обработать ^ z. Это правильно?
 William Pursell10 окт. 2012 г., 19:44
Вы можете асинхронно запускать задание в setsid и ждать его. например:setsid cmd & wait вместо просто.cmd
 William Pursell10 окт. 2012 г., 20:11
Если cmd запускается с помощью setsid, он не получает SIGTSTP, сгенерированный ^ z.
 William Pursell10 окт. 2012 г., 20:47
@January При нажатии ctrl-c текущий запущенный процесс и сценарий получают SIGINT. Текущий запущенный процесс завершается, а затем скрипт выполняет ловушку. Когда вы набираете ^ z, SIGTSTP отправляется как сценарию, так и текущему процессу, поэтому текущий процесс приостанавливается, и сценарий зависает, ожидая его. Когда вы печатаетеkill -20 отправить SIGTSTP,только скрипт получает сигнал.
 Ram10 окт. 2012 г., 20:10
Кажется, чтобы сделать это. Спасибо за помощь! Но просто любопытно, выигралпроцесс все еще остается остановленным под новым сеансом?
 January10 окт. 2012 г., 20:33
Извините, но я нене понимаю Если я заменю SIGTSTP в приведенном выше скрипте на SIGINT, функция очистки вызывается, как и ожидалось, при нажатии ctrl-c. Кроме того, если я делаюpkill -20 test.shРаботает, как и ожидалось, с SIGTSTP. Так что же происходит?

Ваш ответ на вопрос