【问题标题】:change environment variable on a running process in mac更改mac中正在运行的进程的环境变量
【发布时间】:2018-11-21 09:16:14
【问题描述】:

我在 mac 上有一个正在运行的进程,我想使用一些命令行实用程序从进程外部更改环境变量。

我该怎么做?

【问题讨论】:

  • 您要更改哪个变量,为什么?您是否可以访问该流程的源代码?
  • 我想将 SH_AUTH_SOCK 和 SSH_AGENT_PID 变量设置为正在运行的 IntelliJ。我希望运行/调试过程将具有该环境变量。我知道我可以在运行/调试程序之前在“编辑配置”中设置环境变量,但是这些变量的值是通过运行脚本来阻止的。
  • 我过去使用的一种技术是更改配置文件中的值,并向进程发送 SIGHUP 信号,使其重新读取配置文件。

标签: macos environment-variables


【解决方案1】:

您无法通过外部实用程序更改正在运行的进程的环境变量。这样做需要实用程序修改进程的地址空间。请注意,这不是 macOS 的限制。这是 UNIX 进程模型的限制。当内核创建一个 UNIX 进程时,环境变量被放在它的地址空间中;通常在堆栈顶部附近。它们不存储在进程的内核数据结构中。因此没有获取或设置这些变量的系统调用。这意味着除了通过execve() 或相关系统调用创建第二个进程时,一个进程无法影响第二个进程的环境变量。

【讨论】:

  • 这通常是正确的思考方式。基本上,一个例外是调试器或类似调试器的东西,它可以读写目标的内存,甚至可以让目标调用像setenv()这样的函数。
  • @ken-thomases 是的,我确实做到了;即,使用 ptrace(2) 修改正在运行的进程的地址空间。但是任何提出这个问题的人都不会知道足够多的知识来做到这一点,而且无论如何这样做通常都不安全。还要考虑仅更改 TZLANG 值是不够的。您还需要强制该进程调用setlocale() 或类似函数。哪个,取决于进程的当前状态可能不安全。
猜你喜欢
  • 2020-02-04
  • 1970-01-01
  • 1970-01-01
  • 2013-10-30
  • 2010-10-04
  • 1970-01-01
  • 2016-06-25
  • 2013-04-03
  • 1970-01-01
相关资源
最近更新 更多