我有一个launch.sh
脚本,我使用
bsub $settings < launch.sh
此launch.sh
bash脚本看起来简化如下:
function trap_with_arg() {
func="$1" ; shift
for sig ; do
echo "$ES Installing trap for signal $sig"
trap "$func $sig" "$sig"
done
}
function signalHandler() {
# do stuff depending in what stage the script is
}
# Setup the Trap
trap_with_arg signalHandler SIGINT SIGTERM SIGUSR1 SIGUSR2
./start.sh
mpirun process.sh
./end.sh
其中process.sh将两个二进制文件(例如)调用为
./binaryA
./binaryB
我的问题如下:
集群已经将SIGUSR1(在SIGTERM之前大约10分钟)发送到进程(我认为这是运行我的bash
脚本的launch.sh
shell)。
目前我在launch.sh
脚本中捕获此信号并调用一些信号处理程序。问题是,此信号处理程序仅在运行命令完成后才会执行(至少我知道)(例如,可能是mpirun process.sh
或./start.sh
)
如何转发这些信号以使命令/二进制文件正常退出。例如转发到process.sh
(mpirun
,正如我所经历的那样,已经以某种方式转发这些接收到的信号(它是如何做到的?)
转发信号的正确方法是什么(例如也可以转发给二进制文件binaryA, binaryB
?
我不知道如何做到这一点?使命令在后台执行,创建子进程?
感谢您的一些启示: - )
答案 0 :(得分:0)
来自http://www.gnu.org/software/bash/manual/html_node/Signals.html的bash手册:
如果Bash正在等待命令完成并收到已设置陷阱的信号,在命令完成之前不会执行陷阱。当Bash通过wait builtin等待异步命令时,接收到已设置陷阱的信号将导致wait builtin立即返回,退出状态大于128,之后立即执行陷阱。 / em>的
因此,解决方案似乎将命令放在后台并使用“wait”:
something &
wait