从Shell调用脚本和使用system()有什么区别?

4

我已经编写了一个bash脚本来启动系统中的一些进程。它只是调用相应的进程和配置文件,与从命令行调用的方式相同。

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

要启动someprocess,我需要在命令行中调用:

root@supercomputer:~# start someprocess

这非常有效,每次都能成功。但当我从另一个正在运行的C++进程中进行system调用时,someprocess就无法启动了。
system( "start someprocess" )

这个方案适用于我90%的流程,除了一个。工作和不工作的唯一区别在于不工作的那个使用了专有库。我最近在bash脚本中添加了setsid选项,希望启动新会话可以有所帮助,但没有任何改变。我也尝试了popenexecv,但仍然没有变化。
所以我的问题是,使用system()调用与从命令行直接调用有什么区别?
所有进程都在Linux上用C++编写。

1
有什么不同:也许是环境? - Kerrek SB
1
你有检查常见的问题吗 - 权限、LD_PATH、环境变量等等?C++系统包装器是相同的用户和/或root,等等?你从system、popen、execv等函数中得到了什么样的errno值? - Duck
@Kerrek SB,@Duck 在~/.bashrc中设置了环境变量以供此程序使用,我该如何确保/检查在使用system()启动程序时它们被设置?我认为调用一个bash脚本意味着引入了bashrc - zachd1_618
2个回答

2

.bashrc只在交互式的非登录shell下被调用。如果作为非交互式shell被调用,例如在使用带有bash shebang的脚本时使用system(),它只会读取由$BASH_ENV指向的配置文件。

这意味着您有以下选项:

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

我建议选择第一种选项。

您可以在此处找到有关bash如何读取其启动文件的详细说明。我不确定这完全解决了您的问题,但至少可以让您更好地理解问题的一部分。


前两个解决方案似乎没有起作用,但我能够在我的shell脚本中包含一个source命令,设置所有相关的环境变量。你让我找对了方法。谢谢! - zachd1_618

2

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

很可能它们没有被正确地引用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接