如何在启动时通过脚本设置全局环境变量,并使它们可用于登录前运行的应用程序?

sqe*_*ixs 18 boot rhel shell-script environment-variables

我有一个在启动时运行的服务,在该服务中,它在后台调用一个 bash 脚本来导出一些环境变量。我遇到的问题是这些环境变量没有被发送到后台进程的父进程,所以一旦我的脚本执行完毕,它们就消失了。

此外,在脚本运行后,服务会调用另一个脚本来启动我拥有的应用程序。此应用程序需要访问这些环境变量。

我运行它的 RHEL 系统意味着用户永远不会登录,它只会启动并启动应用程序。我知道父进程/shell 的环境变量并不能真正由子后台进程 shell 设置。

我需要一种方法来通过我的服务调用的脚本(虽然不一定在后台)来做到这一点,而不是将它们添加到我的服务中(这对我来说也不起作用),而不是将它们存储在一个/etc/environment.profile或任何类似的东西。

在我的服务中,我尝试添加环境变量(虽然不是我想做的):

    export TEST=192.168.1.1
Run Code Online (Sandbox Code Playgroud)

我也在我的服务中尝试过这个:

    TEST=192.168.1.1
    export TEST=${TEST}
Run Code Online (Sandbox Code Playgroud)

我尝试更改我的服务调用 bash 脚本的方式:

    /bin/asdf/script &
Run Code Online (Sandbox Code Playgroud)

我也试过采购的脚本,使其在同一个外壳(这是我从运行了):

    . ./bin/asdf/script
    #I'm very confused why this didn't work
Run Code Online (Sandbox Code Playgroud)

我还发现看起来很有趣,但在我的情况下并没有真正成功。

小智 14

您可以尝试放置一个脚本来收集变量 /etc/profile.d/

例子:

/etc/profile.d/somescript.sh

#!/bin/bash
TEST=$(cat /var/somefile)
export $TEST
Run Code Online (Sandbox Code Playgroud)

/etc/profile执行将在 中运行任何脚本的调用,/etc/profile.d/这适用于系统上的所有用户,包括 root。


Gil*_*il' 1

一个进程无法影响另一个现有进程的环境。进程仅影响其子进程的环境。

因此,您需要在需要它们的应用程序的祖先中设置这些环境变量。让您的服务调用一个 bash 脚本来设置环境变量,然后启动应用程序,而不是让您的服务单独调用环境设置 bash 脚本和应用程序。

#!/bin/bash
. /path/to/environment/variable/setter.bash
exec /path/to/application
Run Code Online (Sandbox Code Playgroud)