在非交互式会话中填充环境

在非交互式会话中填充环境

我正在开发一个运行 Yocto Poky 作为发行版的嵌入式设备。

最终产品将具有多个由 启动的应用程序SysVinit。只有一个root用户。

我有一些脚本,它们/etc/init.d添加/etc/profile.d了我们的应用程序所需的一些环境变量。我面临的问题是,如果我“手动”运行应用程序(所以我有一个交互式外壳),它们运行得很好,因为脚本/etc/profile.d/是来源的,但是当运行时SysVinit,它们找不到填充的环境(显然)。我们使用的sh是 shell。

我读到了不同的文件,例如.bashrc.profile以及一些变量,例如ENVBASH_ENV。我试图在那里定义我的变量,但没有运气。我发现的一个小解决方法是在登录 shell 中启动我的主应用程序(来自SysVinit):

2:12345:once:/bin/sh -lc /usr/bin/my_app

所以我的问题是:

  1. 如何在启动期间设置环境(也称为无需登录)或让它SysVinit以一种好的方式完成?
  2. 在脚本中执行的导出/etc/init.d根本不会传播到我的环境;这是因为这些脚本是在子 shell 中运行的,而不是在当前脚本中获取的(这将需要登录两次),我想,那么如何从那里导出变量呢?
  3. 我的解决方法是有效的解决方案吗?

答案1

  1. 如何在启动期间设置环境(也称为无需登录)或让 SysVinit 以良好的方式进行设置?

启动期间环境是干净的(未初始化jet)。您需要通过source.命令放置环境变量sh(如果您的服务是脚本)或在程序中初始化它(即通过配置文件)。

服务脚本标头的小示例:

#!/bin/bash

[ -f /etc/profile.d/needed.sh ] && . /etc/profile.d/needed.sh

. . .
  1. 在 /etc/init.d 脚本中执行的导出根本不会传播到我的环境,这是因为这些脚本是在子 shell 中运行,而不是在当前脚本中获取(这将需要登录两次),我猜,那么如何才能我从那里导出变量?

source子 shell 的 env 变量或使用指定的 env 变量调用命令。

服务脚本标头的小示例:

#!/bin/bash

. . .

$(BASH_ENV=/etc/profile.d/needed.sh command)
$(ENV_VAR1=value1 command)

. . .
  1. 我的解决方法是有效的解决方案吗?

如果这是工作的话——这对服务来说是肮脏的方式。参见 1 和 2。

相关内容