我在我的服务器上使用 Ubuntu 9.1(Karmic Koala)。
设置环境变量以便它们在所有进程中全局可用这一简单问题让我抓狂,我希望得到一些帮助!
我尝试使用导出命令在几个不同的“常见”位置(例如 .bashrc、.bashrc、.profile)中设置它们。这些对于 shell 本身和从 shell 中分叉出来的进程非常有用,但对于在 shell 外部启动的进程则不起作用(例如在启动时启动的守护进程,或者对我来说特别烦人的是 Capistrano 启动的 Mongrel 似乎没有设置这些变量,因此 Ruby 无法访问它们)。
我也尝试了一些疯狂的想法,例如将它们设置在 shell 脚本中并在启动时调用该脚本(通过 update-rc.d 方法),但无济于事。
在 Windows 中,可以简单地定义一个“系统变量”,该变量可用于操作系统中的所有进程。如何在 Linux 中做到这一点;特别是基于 Debian 的操作系统?
答案1
进程(包括 shell)只从父进程继承变量。此后无法从外部更改它们。
尽可能在启动时(对于系统进程)或 shell 调用时(对于用户进程)设置“全局变量”,或者在多个地方设置它们。
这看起来似乎很麻烦,但改变另一个进程环境的能力将是一个错误,并会引入各种令人讨厌的竞争条件。
您想要“全局”环境变量,想做什么?可能有办法解决您的问题。
解决方法:用你喜欢的 shell 格式编写一个最小脚本,仅有的设置所需的变量并将其放在全局可访问的位置:
/etc/loglocaltion.sh
:
export MY_LOG_DIR=/opt/share/mylog
export MY_DEFAULT_LOG_LEVEL=URGENT
对于要使用该配置的所有内容,请执行以下操作之一
- 从 shell 启动它,该 shell
source
在其非交互式登录文件(被读取的文件)中包含 ed loglocation.sh全部shell 的实例,即.bash_profile
)。 loglocation.sh
在启动真正的程序之前编写一个最小的包装脚本。launchcorelogger.sh
:
CORELOGGER=/opt/sbin/mycorelogger
source /etc/loglocation.sh
exec $CORELOGGER
并init
运行了脚本。
现在,如果您首先从新的 shell 运行它们或者使用重新启动的系统守护进程(/etc/init.d/mycorelogger restart
或其他方式)重新启动它们,对 loglocation 脚本的编辑将影响所有相关处理。
答案2
我建议将环境变量放在 /etc/environment 中。我的当前环境变量包含
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games"
NUKE_PATH=/spr/studio/codebase/nuke
并且为 cron 进程和 Bash shell 设置了 NUKE_PATH。
(遗憾的是,对于由流程排队应用程序 Deadline 启动的流程,这是不可能的,但这是我的问题,不是你的问题 :-)
答案3
这篇文章帮助了我:https://help.ubuntu.com/community/EnvironmentVariables
本质上,/etc/environment
它适用于系统范围的变量,并且/etc/profile.d/
每当有人通过控制台或 ssh 登录时,.sh 文件都会运行。