Можете ли вы указать отдельную ловушку в подоболочке, созданной с помощью ()?

Я пишу скрипт, который запускает подоболочку, чтобы уйти и сделать некоторую работу. В частном случае сценарий должен сказать подоболочке, чтобы он полностью остановился на том, что он делает, и выйдет рано. Тем не менее, мой psuedo-код ниже, похоже, не работает. Я пытаюсь сделать невозможное? Можно ли определить отдельную ловушку для сигналов в подоболочке?

#!/bin/bash function myExitFunction { ... } trap myExitFunction SIGTERM while [ 1 ] ; do waitForSpecialCondition kill -0 $SUBSHELL_PID # check if subshell is running if [ $? -eq 0 ] ; then # and kill it if it is kill $SUBSHELL_PID fi ( someProcess MYOWNCHILD=$! # save someProcess's pid to kill later if I need to trap "kill $MYOWNCHILD" SIGTERM ... # do stuff ) & SUBSHELL_PID=$! done 

  • Как прекратить удаленно называемый «хвост -f», когда соединение закрыто?
  • Что такое ожидающие сигналы?
  • Есть ли программа, которая может отправить мне уведомление по электронной почте, когда процесс завершится?
  • Как я могу проверить, запущена ли программа из сценария
  • Как контролировать потребление ресурсов при запуске процесса?
  • Отключение генерации произвольной памяти в моих программах
  • При прерывании процесса происходит утечка памяти?
  • Как предотвратить процесс зависания компьютера?
  • One Solution collect form web for “Можете ли вы указать отдельную ловушку в подоболочке, созданной с помощью ()?”

    Оказывается, моя проблема не в том, что я действительно думал. Ниже приведен скрипт, который ведет себя как psuedo-код выше. Он функционирует точно так, как я ожидал (хотя и немного надуман, чтобы быть простым), и является хорошим примером наличия отдельных ловушек сигнала для процесса родительской и дочерней оболочки.

    Функцию этой ловушки можно продемонстрировать, просто запустив скрипт и выйдя на ctrl-c.

     #!/bin/bash function endEarly { echo "Terminating early" if [ ! -z $SUBSHELL_PID ] ; then echo "Killing subshell with pid $SUBSHELL_PID" kill $SUBSHELL_PID fi exit } trap endEarly SIGTERM SIGINT echo "Give me some input" while [ 1 ] ; do read INPUT # kill the subshell if it exists and is running if [ ! -z $SUBSHELL_PID ] ; then kill -0 $SUBSHELL_PID if [ $? -eq 0 ] ; then kill $SUBSHELL_PID fi fi echo "Now I'll repeat your input. Feel free to change it" echo "at any time by typing it again and hitting <Enter>" { ( while [ 1 ] ; do echo "$INPUT" sleep 5 done ) & CHILD_PID=$! trap "kill $CHILD_PID;" SIGTERM SIGINT wait $CHILD_PID } & SUBSHELL_PID=$! done 
    Interesting Posts

    Как я могу заставить stdin всегда потребляться?

    Поиск дубликатов файлов и их замена символическими ссылками

    Как установить LXDE и X Window System на Debian Squeeze

    Какое правило удева срабатывало?

    Компиляция и запуск Snapper для Ubuntu

    Как добавить папку на удаленный хост PATH с помощью сценария оболочки?

    Grub rescue "не найден: 'grub_efi_secure_boot'", не может исправить ошибку «неизвестной файловой системы»

    shell Script: сортировка файлов в каталогах и подкаталогах

    Запуск сценария при неудачной попытке разблокировки экрана

    Какие средства командной строки доступны для тестирования веб-службы?

    Изменение раскладки клавиатуры с использованием символа Кириллиса

    Мой ISO загружен как Tar.Gz?

    Инструмент разрешения имен доменов, не относящийся к DNS

    RHEL5 – RHEL6 Обновление

    Где я должен устанавливать пакеты, созданные из источника, в качестве пользователя без полномочий root?

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