我有这种脚本 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
答案 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
希望这会有所帮助。