我有一个程序需要运行一个程序,我们将在我们的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)。
答案 0 :(得分:1)
两个不同的想法:
SHELL
环境变量更改为/bin/bash
,然后致电system()
,或: