LINUX.ORG.RU

как забиндить отправку SIGUSR по аналогии с SIGINT/Ctrl+C ?


0

0

Вот нажимаю я Ctrl+C - шелл (?) отправляет процессу, запущенному на нём, SIGINT.
Как бы так сделать, чтобы по нажатию, например, Ctrl+U, процессу, занимающему в данный момент шелл, отправлялся SIGUSR1?

За полчаса в гугле ответа так и не нашёл, какие именно доки читать тоже не понял.

Шелл - интересует главным образом bash.

Ответ на: комментарий от drull

Благодарю за указание правильного направления для поиска.

Другое дело, что поиск толком ничего не дал, я научился переназначать кучу действий на другие хоткеи, но не добавлять новый функционал :)

В итоге, так как моя текущая задача не предполагает интерактивного режима работы с запускаемым приложением, а нужно всего-навсего не запускать второй терминал для отправки сигналов, была набросана вот такая обёртка.

#!/bin/bash

# based on
# keypress.sh: Detect a user keypress ("hot keys").

echo

echo "starting $1.."
echo

$1 &

CHILDPID=$!
echo "
process started with $CHILDPID pid..
let's check it..
"
ps auxww | grep -v grep | grep $CHILDPID
echo

old_tty_settings=$(stty -g)   # Save old settings (why?).
stty -icanon
while true
  do
    Keypress=$(head -c1)
    echo
    echo "$Keypress was pressed"
    if [ "$Keypress" == "u" ]
      then
        kill -USR1 $CHILDPID
    fi
    if [ "$Keypress" == "c" ]
      then
        kill $CHILDPID
#       sleep 1
#        kill -9 $CHILDPID
        break
    fi
  done

stty "$old_tty_settings"      # Restore old settings.

# Thanks, Stephane Chazelas.

exit 0

IMHO, тут всё понятно, при нажатии «u» отправляется SIGUSR1, при нажатии «c» отправляется SIGTERM и завершается сам скрипт-обёртка.

По уму, наверное, стоит ещё добавить обработчик SIGINT :)

sedogrep
() автор топика
Ответ на: комментарий от sedogrep

После прочтения man trap.

#!/bin/bash

# based on
# keypress.sh: Detect a user keypress ("hot keys").

echo

echo "starting $1.."
echo

$1 &

CHILDPID=$!
echo "
process started with $CHILDPID pid..
let's check it..
"
ps auxww | grep -v grep | grep $CHILDPID
echo

old_tty_settings=$(stty -g)   # Save old settings (why?).
stty -icanon

trap 'kill $CHILDPID ; stty "$old_tty_settings" ; exit 0' 2

while true
  do
    Keypress=$(head -c1)
    echo
    echo "$Keypress was pressed"
    if [ "$Keypress" == "u" ]
      then
        kill -USR1 $CHILDPID
    fi
  done

# Thanks, Stephane Chazelas.

exit 0
Теперь «c» не нужен, завершаемся по стандартному Ctrl+C.

sedogrep
() автор топика
Ответ на: комментарий от sedogrep

кстати можно копать еще в сторону встроенной в bash команды "bind".
к примеру прописать в башрц что-то типа такого:
bind '"\C-v"':"\"killall -31 имятвоегоскрипта\"" #забиндить на Ctrl+v команду `killall -31 имятвоегоскрипта`

drull ★☆☆☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.