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


17

我有一个在启动时运行的服务,在该服务中它在后台调用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 &

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

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

我还发现看起来很有趣,但在我看来并没有真正实现。

Answers:


12

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

例:

/etc/profile.d/somescript.sh

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

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


您可能正在这里做某事。尽管由于IA的原因该脚本无法位于/ etc目录中,所以我不想完全这样做。但是我认为我可以在其中创建指向我的脚本的符号链接。但是,使事情复杂化的是,脚本设置的某些环境变量来自服务设置的环境变量。因此这可能行不通,因为必须在服务脚本结束之前就已经设置了变量,但还不算太早,否则服务尚未创建所需的环境变量。
sqenix 2011年

我想我可以摆脱对服务中设置的变量的依赖。在这种情况下,只要脚本在服务启动之前运行就可以了。您知道登录外壳启动的时间吗?还是可以控制登录Shell何时启动?我的运行级别在rcX.d目录中没有为此提供的服务。
sqenix 2011年

1

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

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

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

从我在网上阅读的内容来看,确实存在一些破解(与源脚本中的eval或使用gdb有关)。我对在后台运行不是很感兴趣,如果我可以在当前“外壳”中运行命令(在执行服务时在引导过程中是否在外壳中?),那也可以。
sqenix 2011年

不幸的是,我无法从服务启动应用程序,因为启动了许多不同的进程,并且从应用程序启动脚本配置了一些东西,并且对于IA,它们必须与服务分开保存。
sqenix 2011年

@sqenixs Shell是一个与其他进程一样的进程。没有“被壳”之类的东西。当您说“在源脚本上评估”时,这是一个协议,程序(可能不是shell脚本)以shell语法打印定义,而shell脚本解释它们。使用gdb设置环境变量可能有效,或者无效,或者可能导致应用程序崩溃;如您所料,不建议在生产环境中使用调试器(也是有充分理由的)。
吉尔斯(Gilles)“所以,别再邪恶了”,

您的问题可能有解决方案,但是您需要对要求更加精确。在您的问题中,您写道“在脚本运行后,服务然后调用另一个脚本来启动应用程序”。因此,您似乎有一个解决方案:在其他脚本中设置环境变量。但是随后在注释中写道:“无法从服务启动应用程序”。那是什么呢?
吉尔(Gilles)“所以,别再邪恶了”,

也许在引导时制作或配置/ sbin / init的环境。由于每个进程无论如何都是init的子进程,因此子进程可以获取环境。只是一个想法/猜测。
Nikhil Mulley
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.