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

Я пишу скрипт, который запускает подоболочку, чтобы уйти и сделать некоторую работу. В частном случае сценарий должен сказать подоболочке, чтобы он полностью остановился на том, что он делает, и выйдет рано. Тем не менее, мой 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 

  • Вопросы по внутренним ядрам Linux
  • Есть ли какой-либо UNIX-вариант, по которому дочерний процесс умирает с его родителем?
  • Есть ли журнал прошлых потоков, которые теперь закрыты?
  • Является ли nohup неопределенным?
  • Содержимое файла / proc / <PID> / cmdline зависит от скрипта shebang?
  • Предотвращение доступа SIGINT к дочерним процессам
  • Как узнать, сколько времени работает процесс?
  • возможно ли задержать Linux OOM Killer и запустить мой процесс?
  • 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 
    Linux и Unix - лучшая ОС в мире.