конвейер tee прерывается до конца при перехвате сигнала

#bash

#bash

Вопрос:

У меня есть такой скрипт program.sh :

 #!/bin/bash

catch_sigint()
{
    echo "program interrupted"
    exit
}
trap catch_sigint INT TERM

catch_exit()
{
    echo "program Exiting"
}
trap catch_exit EXIT

#rest of my program...
echo "program Running"
sleep 2
echo "program normal exit"
  

это вызывается другим подобным скриптом:

 #!/bin/bash

catch_sigint()
{
    echo "script interrupted"
    exit
}
trap catch_sigint INT TERM

catch_exit()
{
    echo "script Exiting"
    kill -TERM $prog_pid
    wait $prog_pid
    echo "script END"
}
trap catch_exit EXIT


./program.sh amp;> >(tee -a log) amp;
prog_pid=$!
ps $prog_pid

# my code...
sleep 5
echo "script normal exit"
  

Я вижу на терминале и в файле журнала, что мой program.sh «Выполняется». Однако я не вижу, что он завершается. Действительно, когда я не выполняю перенаправление на tee, я хорошо вижу на терминале, что он «завершается», так что уничтожение с помощью pid работает.

Итак, я думаю, что перенаправление tee прерывается одновременно с program.sh но чего я хотел бы, так это увидеть все журналы в терминале и файле журнала. Как я могу это сделать?

Обновление от 13 марта 2019

Я обновил код, чтобы показать реальный вариант использования, который действительно показывает проблему. Фактически, у каждого скрипта есть свой перехват сигнала. Итак, я предполагаю, что перенаправление tee прерывается, как и остальная часть программы, поэтому он ничего не показывает. Мой вывод с прерыванием:

 program Running
  PID TTY      STAT   TIME COMMAND
 4922 pts/1    S      0:00 /bin/bash ./program.sh
^Cscript interrupted
script Exiting
script END
  

Мой вывод без прерываний:

 program Running
  PID TTY      STAT   TIME COMMAND
 4915 pts/1    S      0:00 /bin/bash ./program.sh
program normal exit
program Exiting
script Exiting
./script.sh: ligne 13 : kill: (4915) - Aucun processus de ce type
script normal exit
script END
  

Комментарии:

1. Я не могу воспроизвести проблему. Единственное решение, которое у меня есть, вы вызываете kill -TERM до того, как другой скрипт зарегистрировал trap .. EXIT . точка обучения . Пожалуйста, предоставьте лучший mcve.

2. Привет, большое спасибо за ваш ответ. Я обновил свой вопрос, потому что это не было хорошим описанием моей проблемы.

Ответ №1:

Я изменил ваши 2 скрипта, имитируя время выполнения, перейдя в режим ожидания и распечатав пакетный процесс. Вы можете видеть «Запуск» и «Выход» на выходе. Вероятно, в вашем случае вызывающий скрипт завершает program.sh чтобы быстро?

program.sh

 #!/bin/bash

catch_sigint()
{
    exit
}
trap catch_sigint INT TERM

catch_exit()
{
    echo "Exiting"
}
trap catch_exit EXIT

#rest of my program...
echo "Running"
sleep 2
  

script.sh

 #!/bin/bash

./program.sh amp;> >(tee -a log) amp;
prog_pid=$!
ps $prog_pid

# my program...
sleep 1
# end of the program ...
kill -TERM $prog_pid
wait $prog_pid
  

В результате я получаю:

 $ ./script.sh
Running
  PID TTY      STAT   TIME COMMAND
 3081 pts/4    S      0:00 /bin/bash ./program.sh
Exiting

  

Надеюсь, это поможет.

Комментарии:

1. Привет, большое спасибо за ваш ответ. Я обновил свой вопрос, потому что это не было хорошим описанием моей проблемы.