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

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

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

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

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

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

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

    export TEST=192.168.1.1

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

    TEST=192.168.1.1
    export TEST=${TEST}

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

    /bin/asdf/script &

我还尝试获取脚本,以便它在同一个 shell 中运行(我从):

    . ./bin/asdf/script
    #I'm very confused why this didn't work

我还发现这看起来很有趣,但在我的案例中并没有真正成功。

答案1

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

例子:

/etc/profile.d/somescript.sh

#!/bin/bash
TEST=$(cat /var/somefile)
export $TEST

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

答案2

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

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

#!/bin/bash
. /path/to/environment/variable/setter.bash
exec /path/to/application

相关内容