有没有办法一起使用qsub和source?

时间:2013-01-25 11:58:31

标签: bash shell qsub

我写了一个shell脚本来分别处理一堆文件,比如这个

#!/bin/bash

#set parameters (I have many)
...

#find the files and do iteratively
for File in $FileList; do
    source MyProcessing.sh
done

MyProcessing.sh是调用脚本,主脚本中的变量和函数用于调用脚本。

现在我想将我的shell脚本移动到集群,并在迭代中使用qsub。我试过了

#find the files and do iteratively
for File in $FileList; do
    echo "source MyProcessing.sh" | qsub
done

但它不会以这种方式起作用。有人可以帮忙吗?提前谢谢。

2 个答案:

答案 0 :(得分:3)

变量和函数是脚本的本地变量。这意味着source MyProcessing.sh将有效,但bash MyProcessing.sh不会。第二种语法创建一个子shell,这意味着一个新的Unix进程和Unix进程被隔离。

qsub也是如此,因为你通过管道调用它:BASH将创建一个新进程qsub并将stdin设置为source MyProcessing.sh。只将这23个字节传递给qsub,而不是其他任何内容。

如果你希望这个工作,那么你将不得不编写一个100%独立于主脚本的新脚本(即它不能使用任何变量或函数)。然后,您必须阅读qsub的文档以了解如何设置它。通常,这样的工具仅在您在群集的每个节点上分发MyProcessing.sh的副本后才起作用。

此外,该工具可能不会试图找出脚本需要的其他数据,因此您还必须将文件复制到群集节点(可能将它们放在共享文件系统上)。

答案 1 :(得分:0)

使用:

(set; echo "source MyProcessing.sh") | qsub

您需要在qsub shell中设置当前变量。