Bash Trap будет эхо от клавиатуры Ctrl-C, а не убить - PullRequest
0 голосов
/ 25 октября 2019

Скажем, у меня есть сценарий:

#!/bin/bash
# test_trap.sh

trap "echo SIGINT captured!" SIGINT
echo $$

sleep 1000

Я знаю, что команда trap будет выполняться только после завершения sleep 1000 при получении сигнала SIGINT. Но команда trap будет выполнена, когда я нажму на клавиатуре Ctrl-C:

> sh test_sh.sh
50138
^CSIGINT captured!

И с помощью kill -s SIGINT не будет.

Что мне здесь не хватает?

Версия bash - это GNU bash, 4.2.46 (2) -релиз

1 Ответ

1 голос
/ 25 октября 2019

При kill -s SIGINT 50138 вы только отправляете сигнал процессу оболочки, и нужно дождаться завершения sleep 1000, потому что sleep не получает сигнал.

Control-C, тем не менее, заставляет терминал отправлять SIGINT каждому процессу в текущей группе процессов, поэтому оба сценария оболочки и sleep получают его. Ваш сценарий по-прежнему не обрабатывает команду trap до тех пор, пока sleep не завершится, но sleep немедленно завершится в ответ на SIGINT, который он только что получил от терминала.

Если ваш kill поддерживает это,Вы также можете использовать kill -s SIGINT -50138 (обратите внимание на отрицательный идентификатор процесса), чтобы отправить SIGINT всей группе процессов.

...