捕获信号后,三通管道在结束前被杀死

时间:2019-03-08 08:41:44

标签: 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 &> >(tee -a log) &
prog_pid=$!
ps $prog_pid

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

我可以在终端和日志文件中看到我的program.sh正在“运行”。但是我看不到它正在退出。确实,当我不执行重定向到 tee 的操作时,我可以在终端上很好地看到它是“ Exiting”,因此按pid进行杀死是有效的。

因此,我认为 tee 重定向与 program.sh 同时被终止,但是我想在终端和日志文件。我该怎么办?

2019年3月13日更新

我已经更新了代码,以显示真正显示问题的实际用例。实际上,每个脚本都有其信号陷阱。因此,我猜想 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 个答案:

答案 0 :(得分:0)

我修改了您的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 &> >(tee -a log) &
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

希望这会有所帮助。