【问题标题】:Nodejs - Get environment variables of running processNodejs - 获取正在运行的进程的环境变量
【发布时间】:2020-02-04 22:04:27
【问题描述】:

我正在为 vscode 写一个扩展,我需要获取一个已经在运行的进程的环境变量。但我没能找到办法。

我知道如何在 python 中使用 psutil:

for proc in psutil.process_iter(attrs=['name', 'exe']):
    if proc.info['name'].lower() == 'SomeProcess.exe'.lower():
        return proc.environ()

javascript/nodejs 有类似的东西吗?

【问题讨论】:

  • process.env 是移动。

标签: javascript node.js typescript vscode-extensions


【解决方案1】:

您可以使用 child_process 模块生成终端并在平台上执行以下命令并获取变量,解析和使用或编写本机节点模块以访问每个平台的适当 API 并获取输出。

Windows(使用 powershell,PID 为 2019)

(Get-Process -id 2019).StartInfo.EnvironmentVariables

Linux

tr '\0' '\n' < /proc/2019/environ

苹果机

ps eww -o command 2019  | tr ' ' '\n'

感谢https://serverfault.com/a/66366 & https://stackoverflow.com/a/28193753/12167785 & https://apple.stackexchange.com/a/254253 & https://stackoverflow.com/a/11547409/12167785 & https://stackoverflow.com/a/18765553/12167785

【讨论】:

  • 它是否也适用于进程名称而不是 PID?
  • (Get-Process -id processnmae).StartInfo.EnvironmentVariables [for windows]
  • @psclkhoury 我建议你依赖 PID,因为可以有多个同名进程
  • 是的,但我不知道进程 ID。我只知道进程名。
  • 哦。 ps -ef | awk '$8=="name_of_process" {print $2}' (linux ,从名称中获取 pid 然后使用答案)
【解决方案2】:

结合@SudhakarRS 的回答:

var child = require('child_process').execFile('powershell', [ 
    '(Get-Process SomeProcess).StartInfo.EnvironmentVariables' 
], function(err, stdout, stderr) { 
    console.log(stdout);
}); 

如果要调试它,请确保查看 errstderr

notepad 替换SomeProcess 对我有用,但使用notepad.exe 不行。

在 powershell 上,您可以使用 Get-Process [process name] 获取具有特定名称的进程。

因此,例如,如果我运行 4 个记事本实例并执行 Get-Process notepad,我会看到:

您可以使用 (Get-Process notepad).Id 获取进程 ID,它会返回:

您可以使用相同的代码来选择 ID:

var child = require('child_process').execFile(
    'powershell',
    ['(Get-Process notepad).Id'],
    function(err, stdout, stderr) { 
        var ids = stdout.split("\r\n");
        ids.pop(); //remove the blank string at the end
        console.log(ids);
    }
);

^ 返回:

如果你只想获取第一个有名字的进程,那就是:

(Get-Process notepad)[0].StartInfo.EnvironmentVariables

^ 显然将notepad 替换为您的进程名称。

【讨论】:

    【解决方案3】:

    简单的方法(来自here,你可以使用shelljs之类的东西然后运行:

    ps faux | grep 'PROCESS_NAME'
    

    然后提取进程ID(我只是在处理正则表达式)然后执行:

    cat /proc/THE_PROCESS/environ | tr '\0' '\n'
    

    您会以字符串形式返回 env var:

    THEVAR=1
    ANOTHERVAR=2
    

    我认为你只是用 '\n' 分割字符串,但我正在检查!

    我会在确定正则表达式后更新它。 **您使用的是 linux/mac 还是 windows?

    更新:检查https://github.com/shelljs/shx 是否跨平台

    【讨论】:

    • 我在 Windows 上,但由于这是一个扩展,如果它可以在所有平台上使用相同的解决方案,我会更喜欢。
    • 嗯,ShellJS 应该是可移植的,我现在无法测试,但会尽快测试。随意接受解决您的特定情况的任何其他相关答案,我建议编辑标题和描述,使其包含窗口。
    • 说您可以结合这些答案,然后找出您正在运行的平台来运行正确的命令!
    • 你想用\r\n分割(至少在windows上?)
    • 我可以提前测试一下,我会尽力的!
    【解决方案4】:

    是的:

    process.env 会给你你所需要的:)

    你可以阅读更多here

    编辑:它只会为您所在的进程提供环境变量...我误解了,您想要另一个进程的变量吗?

    【讨论】:

      【解决方案5】:

      在 javascript/nodejs 中没有内置的方法可以做到这一点。如果你真的需要这样做,那么最好的方法是在终端中运行一个命令,然后解析输出来构造你需要的对象。

      【讨论】:

        猜你喜欢
        • 2020-12-22
        • 1970-01-01
        • 2020-10-29
        • 2017-06-06
        • 2011-12-10
        • 1970-01-01
        • 2011-08-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多