我想为在OpenStack VM上运行的管道开发基于bash的部署脚本有点困难。总共有4个脚本:
head_node.sh - 启动vm并将适当的磁盘存储附加到VM。完成后,它会通过将命令通过ssh传递给VM来顺序运行脚本(2和3)。
install.sh - VM-side,安装管道所需的所有适当软件。
run.sh - VM端,在VM上安装存储并从对象存储下载原始数据。然后它运行最终脚本,但是通过使用nohup ./pipeline.sh &
从ssh创建的shell中分离进程来执行此操作。我想脱离shell的原因是下一部分主要是计算,可能需要数天才能完成。因此,用户不应该长时间打开外壳,它应该只在后台运行。
pipeline.sh - VM端,本质上是一个循环遍历文件列表的for循环,以及对这些和中间文件的顺序运行命令。分析结果,然后将其分级回对象存储器。然后VM基本上告诉头节点杀死它。
现在我遇到了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
答案 0 :(得分:0)
由于我从ssh实例唤起run.sh脚本,从脚本启动的子进程(即pipeline.sh)将无法从shell中正确分离,并且在终止ssh实例时会出错,从而引发run.sh 。可以通过从头节点调用它来正确分离pipeline.sh脚本,例如nohup ssh $ vm_ip'。/ pipeline.sh'&,这将使会话保持活动直到管道结束。