#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. Привет, большое спасибо за ваш ответ. Я обновил свой вопрос, потому что это не было хорошим описанием моей проблемы.