C ++执行临时文件作为bash脚本

我有一个需要运行程序的程序,我们将在我们的Linux(CentOS)集群上并行调用externalProg – 或者说,它需要运行多个externalProg实例,每个实例都在不同的内核上运行。 每个“线程”根据几个参数创build3个文件 – externalProg的input,一个告诉externalProg如何执行我的文件的命令文件,以及一个用于设置环境的bash脚本(调用制造商提供的安装脚本)以及实际上用我的input调用externalProg。

因为这需要与未知数量的并发线程并行,我不想冒险覆盖另一个线程的文件,我正在创build临时文件

mkstemp("PREFIX_XXXXXX") 

为这些input文件。 外部程序运行后,我提取相关数据并存储,并closures临时文件(因此删除它们)。

我们将调用创build的文件(实际上有一个基于上述模板的名称)

 tmpInputs - Inputs to externalProg tmpCommand - Input that tells externalProg how to execute tmpInputs tmpBash - bash script to set up and call externalProg with my inputs 

文件tmpBash看起来像

 source /path/to/setup/script # Sets up environment variables externalProg < /path/to/tmpCommand 

其中tmpCommand只是一个简单的文本文件。

我遇到的问题实际上是执行bash脚本。 在我的程序中,我打电话

 ostringstream launchcmd; launchcmd << "bash " << path_to_tmpBash system(launchcmd.str().c_str()); 

但没有任何反应。 没有错误,没有警告,没有'文件未find'或权限被拒绝或任何东西。 我已经validation过这些文件正在创build并且有正确的内容。 system()之后的其余代码被成功执行(尽pipe由于externalProg未运行而失败)。

奇怪的是,如果我回到terminal并打字

 bash /path/to/tmpBash 

那么externalProg会成功执行。 我也cout'd launchcmdstring,复制并粘贴到terminal,这也工作成功。 出于某种原因,只有在我的程序中调用时才会失败。

经过一番实验后,我确定system()在我们的集群上调用/ bin / sh。 如果我改变launchcmd看起来像

 /path/to/tmpBash 

(所以完整的命令应该看起来像/ bin / sh / path / to / tmpBash),我得到一个权限被拒绝的错误,这并不奇怪。 问题是,我不能chmod + x的tmpBash文件,而它仍然是开放的,如果我closures文件,它会被删除 – 所以我不知道如何解决这个问题。

有什么明显的错误,我在做什么,或系统()有一些细微的差距,我失踪了?

编辑:我想补充说,我可以成功地调用像

 system("echo $PATH") 

并获得预期的结果(在这种情况下,我的默认$ PATH)。

两个单独的想法:

  • 改变你的SHELL环境变量为/bin/bash ,然后调用system()

要么:

  • 直接使用execve execve('/ bin / bash',['/ path / to / tmpBash'],environ)