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

时间:2014-12-03 22:44:18

标签: c++ linux multithreading bash shell

我有一个程序需要运行一个程序,我们将在我们的linux(CentOS)集群上并行调用externalProg - 或者更确切地说,它需要运行许多externalProg实例,每个实例都在不同的内核上。每个"线程"基于一些参数创建3个文件 - externalProg的输入,告诉externalProg如何执行我的文件的命令文件,以及用于设置环境的bash脚本(调用制造商提供的安装脚本)并实际调用externalProg我的意见。

由于这需要与未知数量的并发线程并行,并且我不想冒险覆盖其他线程的文件,我正在使用

创建临时文件
mkstemp("PREFIX_XXXXXX")

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

我们会调用创建的文件(实际上有一个基于上面模板的名称)

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());

但没有任何反应。没有错误,没有警告,没有找到文件&#39;或许可被拒绝或任何事情。我已经验证文件正在创建并具有正确的内容。 system()之后的其余代码成功执行(虽然因为externalProg没有运行而失败)。

奇怪的是,如果我回到终端并输入

bash /path/to/tmpBash

然后externalProg成功执行。我还要关注launchcmd字符串,将其复制并粘贴到终端中,这也可以成功运行。出于某种原因,这只有在我的程序中调用时才会失败。

经过一些实验,我确定system()在我们的集群上调用/ bin / sh。如果我将launchcmd更改为

/path/to/tmpBash

(因此完整命令应该看起来像/ bin / sh / path / to / tmpBash),我得到一个权限被拒绝错误,这并不奇怪。问题是我无法在tmpBash文件仍然打开的情况下chmod + x,如果我关闭文件,它会被删除 - 所以我不确定如何解决这个问题。 / p>

我做的事情是否有明显的错误,或者系统()是否有一些我不知道的细微差别?

编辑:我想补充一点,我可以成功调用

之类的内容
system("echo $PATH")

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

1 个答案:

答案 0 :(得分:1)

两个不同的想法:

  • 将您的SHELL环境变量更改为/bin/bash,然后致电system()

或:

  • 使用execve directly`execve(&#39; / bin / bash&#39;,[&#39; / path / to / tmpBash&#39;],环境)