0

我写了一个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

但它不能以这种方式工作。任何人都可以帮忙吗?先感谢您。

4

2 回答 2

3

变量和函数对于脚本来说是本地的。这意味着source MyProcessing.sh将起作用,但bash MyProcessing.sh不会。第二种语法创建一个子外壳,这意味着一个新的 Unix 进程和 Unix 进程是隔离的。

qsub由于您通过管道调用它,因此也是如此:BASH 将创建一个新进程qsub并将标准输入设置为source MyProcessing.sh. 这只将这 23 个字节传递给qsub其他任何东西。

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

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

于 2013-01-25T15:21:06.490 回答
0

利用:

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

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

于 2013-01-26T06:19:20.057 回答