在群集上提交的bash脚本中转发信号

时间:2015-06-09 18:33:24

标签: bash unix signals mpi cluster-computing

我有一个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.shmpirun,正如我所经历的那样,已经以某种方式转发这些接收到的信号(它是如何做到的?) 转发信号的正确方法是什么(例如也可以转发给二进制文件binaryA, binaryB? 我不知道如何做到这一点?使命令在后台执行,创建子进程?

感谢您的一些启示: - )

1 个答案:

答案 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