【发布时间】:2014-12-03 22:44:18
【问题描述】:
我有一个程序需要运行一个程序,我们将在我们的 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());
但是什么也没发生。没有错误,没有警告,没有“找不到文件”或权限被拒绝或任何东西。我已验证文件正在创建并且内容正确。 system() 之后的其余代码已成功执行(尽管由于 externalProg 未运行而失败)。
奇怪的是,如果我回到终端并输入
bash /path/to/tmpBash
然后externalProg 执行成功。我还计算了launchcmd字符串,将其复制并粘贴到终端中,它也可以成功运行。出于某种原因,这只在我的程序中调用时才会失败。
经过一些实验,我确定 system() 在我们的集群上调用 /bin/sh。如果我将 launchcmd 更改为看起来像
/path/to/tmpBash
(所以完整的命令应该看起来像 /bin/sh /path/to/tmpBash),我得到一个权限被拒绝的错误,这并不奇怪。问题是我无法 chmod +x tmpBash 文件,而它仍然打开,如果我关闭该文件,它会被删除 - 所以我不知道如何解决这个问题。
我做错了什么,还是 system() 有一些我遗漏的细微差别?
编辑:我想补充一点,我可以成功调用类似的东西
system("echo $PATH")
并获得预期的结果(在本例中,是我的默认 $PATH)。
【问题讨论】:
-
ofstream launchcmd;你是说ostringstream launchcmd;吗? (只是因为你说你想使用system(launchcmd.str().c_str());) -
我的意思是 ostringstream!我已经编辑了我的问题来解决这个问题。
标签: c++ linux multithreading bash shell