2010-10-08 128 views
1

我有一个调用的bash函数必须在第一次被调用后由EXIT陷阱调用。该函数在陷阱函数退出后立即再次设置陷阱。如何在陷阱代码中再次设置bash陷阱?

echo 0 > .i 
function launchNextExperiment 
{ 
(# Run in nested subshell 

    # Implement a mutex lock, not shown 

    j=`cat .i` 
    if [ $j -lt $k ] 
    then 
    trap launchNextExperiment EXIT # set trap for this nested subshell 

    ./doStuff & 

    let j=j+1 
    echo $j > .i # variables are not known in outer shell, therefore use 
       # the file .i as a counter 
    fi 

    wait # wait for doStuff to return from background before exiting 
     # from this nested shell and causing an EXIT signal 
) 
} 

launchNextExperiment & 

,我的问题是,这种过滤器仅触发一次,换句话说doStuff只执行了两次。

为什么我不能用一个简单的循环来doStuffk倍的原因是,我竟然叫launchNextExperiment函数一次我的每个CPU的一个子集,而只想要doStuff一个实例,一个CPU上运行因为它的处理密集程度很高。这也是为什么我有一个互斥锁。然后,只要doStuff的实例返回,我想要启动 doStuff(实际上它们都是不同的模拟)的下一个k实例。

如何确保陷阱设置为每个嵌套的子shell,并且最后launchNextExperiment执行的是k次,但每个CPU只执行一次doStuff

+0

出口俘获是清理任务,而不是为程序逻辑。 – ceving 2017-04-12 11:03:27

回答

0

不回答你的问题,但你要完成,而不陷阱和子shell做的事情:

echo 0>i 
k=10 
dispatch_work() 
{ 
    mutex_lock 
    i=$(<i) 
    let i++ 
    echo $i>i 
    mutex_unlock 

    if [ $i < $k ]; do 
    do_work $i 
    dispatch_work 
    fi 
} 

for c in $(seq 1 $cpus); do 
    dispatch_work & 
done