我有一个需要运行程序的程序,我们将在我们的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()
, 要么: