在 Linux 中为所有进程设置环境变量

bha*_*inb 6 unix debian environment-variables

我在我的服务器上使用 Ubuntu 9.1 (Karmic Koala)。

设置环境变量以便它们在所有进程中全局可用的简单问题让我发疯,我希望得到一些帮助!

我已经尝试在几个不同的“常见嫌疑人”位置(例如 .bashrc、.bashrc、.profile)中使用导出命令来设置它们。这些对 shell 本身非常有用,并且进程从 shell 分叉出来,但不适用于在 shell 外启动的进程(例如,守护进程在启动时启动,或者对我来说特别烦人的是 Capistrano 启动的 Mongrel 似乎没有设置这些变量因此 Ruby 无法访问它们)。

我还尝试了一些疯狂的想法,例如将它们设置在 shell 脚本中并在启动时调用此脚本(通过 update-rc.d 方法),但无济于事。

在 Windows 中,可以简单地定义一个“系统变量”,该变量在操作系统中的所有进程中都可用。在 Linux 中如何做到这一点?特别是基于 Debian 的操作系统?

dmc*_*ten 6

进程(包括 shell)只从它们的父进程继承变量。此后无法从外部更改它们。

尽可能早地在引导(对于系统进程)或 shell 调用(对于用户进程)中设置“全局变量”,或者让自己在多个位置设置它们。

这可能看起来很痛苦,但改变另一个进程环境的能力将是一个错误,并且会引入各种令人讨厌的竞争条件。


你想做什么想要“全局”环境变量?可能有办法解决您的问题。

解决方法:以您最喜欢的 shell 格式编写一个最小的脚本,设置您想要的变量并将其放在全局可访问的位置:

/etc/loglocaltion.sh

export MY_LOG_DIR=/opt/share/mylog
export MY_DEFAULT_LOG_LEVEL=URGENT
Run Code Online (Sandbox Code Playgroud)

对于您想要使用该配置的所有内容,请执行以下操作之一

  1. 从 shell 启动它,它source在它的非交互式登录文件中有ed loglocation.sh (为所有shell 实例读取的文件,即.bash_profile)。
  2. loglocation.sh在启动真正的程序之前编写一个最小的包装脚本。launchcorelogger.sh

 

 CORELOGGER=/opt/sbin/mycorelogger
 source /etc/loglocation.sh
 exec $CORELOGGER
Run Code Online (Sandbox Code Playgroud)

init运行了脚本。

现在,如果您在第一种情况下从新的 shell 运行它们或使用重新启动的系统 dameon(/etc/init.d/mycorelogger restart或其他方式)重新启动它们,那么对 loglocation 脚本的编辑将影响所有相关的处理。