我正在开发一个运行 Yocto Poky 作为发行版的嵌入式设备。
最终产品将具有多个由 启动的应用程序SysVinit
。只有一个root
用户。
我有一些脚本,它们/etc/init.d
添加/etc/profile.d
了我们的应用程序所需的一些环境变量。我面临的问题是,如果我“手动”运行应用程序(所以我有一个交互式外壳),它们运行得很好,因为脚本/etc/profile.d/
是来源的,但是当运行时SysVinit
,它们找不到填充的环境(显然)。我们使用的sh
是 shell。
我读到了不同的文件,例如.bashrc
,.profile
以及一些变量,例如ENV
和BASH_ENV
。我试图在那里定义我的变量,但没有运气。我发现的一个小解决方法是在登录 shell 中启动我的主应用程序(来自SysVinit
):
2:12345:once:/bin/sh -lc /usr/bin/my_app
所以我的问题是:
- 如何在启动期间设置环境(也称为无需登录)或让它
SysVinit
以一种好的方式完成? - 在脚本中执行的导出
/etc/init.d
根本不会传播到我的环境;这是因为这些脚本是在子 shell 中运行的,而不是在当前脚本中获取的(这将需要登录两次),我想,那么如何从那里导出变量呢? - 我的解决方法是有效的解决方案吗?
答案1
- 如何在启动期间设置环境(也称为无需登录)或让 SysVinit 以良好的方式进行设置?
启动期间环境是干净的(未初始化jet)。您需要通过source
或.
命令放置环境变量sh
(如果您的服务是脚本)或在程序中初始化它(即通过配置文件)。
服务脚本标头的小示例:
#!/bin/bash
[ -f /etc/profile.d/needed.sh ] && . /etc/profile.d/needed.sh
. . .
- 在 /etc/init.d 脚本中执行的导出根本不会传播到我的环境,这是因为这些脚本是在子 shell 中运行,而不是在当前脚本中获取(这将需要登录两次),我猜,那么如何才能我从那里导出变量?
source
子 shell 的 env 变量或使用指定的 env 变量调用命令。
服务脚本标头的小示例:
#!/bin/bash
. . .
$(BASH_ENV=/etc/profile.d/needed.sh command)
$(ENV_VAR1=value1 command)
. . .
- 我的解决方法是有效的解决方案吗?
如果这是工作的话——这对服务来说是肮脏的方式。参见 1 和 2。