Невозможно переписать команду «trap» для SIGTSTP, SIGTTIN и SIGTTOU

Я хочу захватить сигнал SIGTSTP, но я не могу. Когда я вызываю команду trap без аргументов, я получаю следующее:

 trap -- '' SIGTSTP trap -- '' SIGTTIN trap -- '' SIGTTOU 

Очевидно, что у моей trap есть уже заранее определенное поведение. Проблема в том, что я не могу ее переписать, даже когда я зарегистрирован как root. Когда я использую команду trap , она просто игнорируется для этих трех сигналов. В противном случае он работает нормально.

Я попытался переписать его только по команде:

 trap -- 'echo SIGTSTP' SIGTSTP 

Другая странная вещь: я могу использовать эти сигналы, и они работают нормально, они не игнорируются. Я могу просто использовать SIGTSTP, чтобы прекратить работу над другим процессом и снова продолжить работу с SIGCONT.

Итак, знаете ли вы, как переписать эти команды? И не могли бы вы объяснить это странное поведение?


Моя ОС – Lubuntu 15.04, и я использую GNU bash, версия 4.3.30 (1) -release (x86_64-pc-linux-gnu).

2 Solutions collect form web for “Невозможно переписать команду «trap» для SIGTSTP, SIGTTIN и SIGTTOU”

Вы не указали, какую оболочку вы используете, поэтому в случае, если это ошибка в оболочке, вы не можете помочь вам.

Посмотрев на странице руководства Bourne Shell: http://schillix.sourceforge.net/man/man1/bosh.1.html, вы увидите следующий текст:

  bolic names. Any attempt to set a trap on a signal that was ignored on entry to the current shell is ineffec- tive. An attempt to trap on signal 11 (memory fault) produces an error.code here 

Так что все может быть ОК, но ваша оболочка была вызвана с игнорированием этих сигналов.

Если вы находитесь на современной ОС, вы можете позвонить

  `psig $$` 

чтобы получить информацию о расположении текущей оболочки, и вы можете заменить $$ другими идентификаторами процессов, чтобы проверить другие процессы.

С bash на Ubuntu 15.04, кажется, работает как и ожидалось … как вы пишете свой скрипт?

 #!/bin/bash set -e trap 'echo TSTP' TSTP trap 'echo TTIN' TTIN trap 'echo TTOU' TTOU trap while :; do read a; done # wait forever 

Пример сеанса (набирается 3 раза Ctrl + Z, затем Ctrl + C ):

 $ ./signal.sh trap -- 'echo TSTP' SIGTSTP trap -- 'echo TTIN' SIGTTIN trap -- 'echo TTOU' SIGTTOU ^ZTSTP ^ZTSTP ^ZTSTP ^C 

Я нашел в руководстве, что bash игнорирует эти сигналы, когда он является интерактивным, и управление заданиями разрешено:

  1. Управление заданием (см. Управление заданиями) включено по умолчанию. Когда управление заданиями действует, Bash игнорирует генерируемые клавиатурой сигналы управления работой SIGTTIN, SIGTTOU и SIGTSTP.

Вы можете отключить работу cotnrol с помощью set +m . Однако bash не позволит обновлять обработчики в интерактивном режиме:

 $ bash -c trap $ bash -c 'trap true TSTP && trap' trap -- 'true' SIGTSTP $ bash -i -c trap trap -- '' SIGTSTP trap -- '' SIGTTIN trap -- '' SIGTTOU $ bash -i -c 'trap true TSTP && trap' trap -- '' SIGTSTP trap -- '' SIGTTIN trap -- '' SIGTTOU $ bash -i -c 'set +m && trap true TSTP && trap' trap -- '' SIGTSTP trap -- '' SIGTTIN trap -- '' SIGTTOU 
  • Отображение intr для del key
  • Как сигналы работают внутри страны?
  • Разработка приложений для Linux и обработка сигналов
  • Предотвращение доступа SIGINT к дочерним процессам
  • тайм-аут
  • убийство подпроцессов и ловушек
  • Безопасное выход из цикла в bash
  • Труба всех приостановленных процессов, чтобы убить
  • В Ctrl + C убейте текущую команду, но продолжайте выполнение скрипта
  • Почему компиляция функции ловушки позволяет управлять c-с?
  • При завершении работы перед установкой аварийного сигнала отключите накопители?
  • FreeBSD: все вышло из сигнала 12 после того, как «make buildworld»
  • Interesting Posts

    Как настроить конфигурационные файлы pam.d в CentOS

    Проверьте, содержит ли переменная оболочки абсолютный путь

    Почтовый клиент Linux, который может запускать скрипт PHP для анализа полученного сообщения электронной почты

    Как отключить список пользователей на экране входа в GDM3?

    Linux Mint 17.1 невероятно медленный на AMD A8-5600k

    Как сканировать каталог с пробелом в его имени с помощью maldet

    назначение утилиты run-parts (8)

    Поиск тестируемой утилиты для получения абсолютного пути к относительной целевой символической ссылке

    Как установить mercurial на openSUSE?

    Настройка пользовательского завершения Bash приводит к зависанию на вкладке

    Как отслеживать всплески памяти?

    Каким образом RHEL / centos отличается от Fedora пакетным / релевантным пользователю?

    Печать содержимого системного буфера обмена в bash

    PiGlow не работает

    Не удалось загрузить после установки после обновления systemd

    Linux и Unix - лучшая ОС в мире.