4

我已经构建了一个 bash 脚本来启动我系统中的一些进程。它只是调用进程和相关的配置文件。就像我从命令行调用一样。

#!/bin/bash
# Start specified process in a new session
setsid $1 &>/dev/null &

所以要启动someprocess,我会从命令行调用:

root@supercomputer:~# start someprocess

这就像一个魅力。每一个过程,每一次。但是当我system从另一个正在运行的 C++ 进程中调用时,它someprocess永远不会启动。

system( "start someprocess" )

这种方法适用于我 90% 的流程,除了一个。工作流程和非工作流程的唯一区别是非工作流程使用了下面的专有库。我最近setsid在 bash 脚本中添加了该选项,希望开始一个新会话会有所帮助,但这并没有什么不同。我也试过popen,和execv。没变。

system()所以我的问题是用命令行调用和从命令行调用相同的调用有什么区别?

Linux 上的所有进程都是用 C++ 编写的。

4

2 回答 2

2

检查 system() 调用中使用的环境变量。例如,调用 system 打印出一些变量,并查看它们是否与您在命令行中看到的相匹配。

很可能它们的来源不正确。

于 2013-07-14T00:51:47.467 回答
2

.bashrc仅当 bash 作为交互式非登录 shell 运行时才调用。如果它作为非交互式 shell 调用,例如在system()带有 bash shebang 的脚本上使用时,它只会读取$BASH_ENV.

这意味着您有以下选择:

  • 添加-l到 shebang - 导致 shell~/.profile在启动时读取
  • $BASH_ENV在调用之前设置为您想要获取的脚本system()
  • 添加-i到 shebang - 将 bash 作为交互式 shell 调用并使其读取~/.bashrc,但也会影响 bash 处理输入/输出的方式。

我推荐第一个选项。

您可以在此处找到有关 bash 如何读取其启动文件的详细说明。我不确定这是否会完全解决您的问题,但它至少可以对问题的那一部分有所了解。

于 2013-07-13T18:21:58.570 回答