如何让厨师重新加载全球path

我正在设置一个简单的厨师食谱来安装一个二进制应用程序。 在Ubuntu或者CentOS中没有这个软件包,所以我写了一个配方,

  1. 从源代码下载tar
  2. 从tar中提取内容
  3. 创build一个将app_home添加到全局$ PATH的bash脚本(它需要是全局的)
  4. 重新加载$ ​​PATH,以便当前login的用户可以在shell命令中引用它

我很好,第3步,但我不能让厨师重新加载$ ​​PATH。 我已经尝试在.bash_profile以及/etc/profile.d/放置新的导出PATH = $ PATH:/ path / to / app / bin ,但是没有成功。

如果我退出shell,并重新ssh我正确地看到PATH,但从来没有在同一个会话,当我跑sudo chef-client

有什么办法,厨师可以自动touch或重新加载PATH,使当前login的用户可以使用它?

Solutions Collecting From Web of "如何让厨师重新加载全球path"

简短的回答:不。环境变量是从父项继承的。 子进程无法更改其父级的环境变量。

长时间的回答:当利用信号(或其他形式的IPC)时,您可以发信号给父母重新加载文件中的环境变量。

如果你有一个文件~/my_environment包含以下内容:

 export FOO="bar" 

在你的bash中执行下面的代码:

 function reload_environment { source ~/my_environment; } trap reload_environment SIGHUP reload_environment 

运行echo $FOO并查看输出bar

现在,当另一个进程向这个bash进程发送HUP信号时,它将通过运行reload_environment函数来重新加载~/my_environment的环境变量。

试一试吧。 通过运行检查bash的PID

 echo $$ 

接下来,将~/my_environment的内容更改为:

 export FOO="fish" 

然后,发送一个SIGHUP给bash的PID:

 kill -HUP 12133 

如果一切顺利的话,在该bash会话上运行echo $FOO会产生fish

对于你的情况,当~/my_environment改变时,你可以使用inotify把HUP信号发送给bash。 如果你从bash运行chef-client ,你可以发送一个HUP信号给你的父PID。

为什么不只是做:

ENV['PATH']="#{ENV['PATH']}:/path/to/app/bin"

在你的厨师食谱? 如果你已经有了额外的路径,那么你将在PATH中结束两次,但是这不会损害任何东西(甚至可以通过添加unless ENV['PATH'].split(/:/).include?("/path/to/app/bin")以外的其他路径unless ENV['PATH'].split(/:/).include?("/path/to/app/bin")以避免这种情况)。

注意:这个答案不回答原来的问题,这是不可能解决的。