从当前shell中调用和分离bash脚本

时间:2016-01-21 00:58:07

标签: bash

我想为在OpenStack VM上运行的管道开发基于bash的部署脚本有点困难。总共有4个脚本:

  1. head_node.sh - 启动vm并将适当的磁盘存储附加到VM。完成后,它会通过将命令通过ssh传递给VM来顺序运行脚本(2和3)。

  2. install.sh - VM-side,安装管道所需的所有适当软件。

  3. run.sh - VM端,在VM上安装存储并从对象存储下载原始数据。然后它运行最终脚本,但是通过使用nohup ./pipeline.sh &从ssh创建的shell中分离进程来执行此操作。我想脱离shell的原因是下一部分主要是计算,可能需要数天才能完成。因此,用户不应该长时间打开外壳,它应该只在后台运行。

  4. pipeline.sh - VM端,本质上是一个循环遍历文件列表的for循环,以及对这些和中间文件的顺序运行命令。分析结果,然后将其分级回对象存储器。然后VM基本上告诉头节点杀死它。

  5. 现在我遇到了nohup的问题。如果我正常启动pipeline.sh脚本(即没有nohup)并将其连接到该shell,一切都运行顺利。但是,如果我分离脚本,它会在for循环的第一次迭代中的第一个命令之后出错。我是否以错误的方式思考这个问题?这样做的正确方法是什么?

    所以这就是它的样子:

    $。/ head_node.sh

    head_node.sh

    #!/bin/bash
    ... launched VM etc
    ssh $vm_ip './install.sh'
    ssh $vm_ip './run.sh'
    exit 0
    

    install.sh - 省略 - 对问题不重要

    run.sh

    #!/bin/bash
    ... mounts storage downloads appropriate files
    nohup ./pipeline.sh > log &
    exit 0
    

    pipeline.sh

    #!/bin/bash
    for f in $(find . -name '*ext')
    do 
    process1 $f
    process2 $f
    ...
    done
    ... stage files to object storage, unmount disks, additional cleanups
    ssh $head_node 'nova delete $vm_hash'
    exit 0
    

1 个答案:

答案 0 :(得分:0)

由于我从ssh实例唤起run.sh脚本,从脚本启动的子进程(即pipeline.sh)将无法从shell中正确分离,并且在终止ssh实例时会出错,从而引发run.sh 。可以通过从头节点调用它来正确分离pipeline.sh脚本,例如nohup ssh $ vm_ip'。/ pipeline.sh'&,这将使会话保持活动直到管道结束。