我正在为vscode编写扩展,并且我需要获取已经在运行的进程的环境变量。但是我找不到解决方法。
我知道如何使用psutil在python中做到这一点:
for proc in psutil.process_iter(attrs=['name', 'exe']):
if proc.info['name'].lower() == 'SomeProcess.exe'.lower():
return proc.environ()
javascript / nodejs是否有类似的东西?
答案 0 :(得分:4)
您可以使用child_process模块生成一个终端并在平台上执行以下命令并获取变量,解析并使用或编写本机节点模块来访问每个平台的正确API并获取输出。
Windows(使用powershell,2019年为PID)
(Get-Process -id 2019).StartInfo.EnvironmentVariables
Linux
tr '\0' '\n' < /proc/2019/environ
Mac
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
答案 1 :(得分:3)
结合@SudhakarRS的答案:
var child = require('child_process').execFile('powershell', [
'(Get-Process SomeProcess).StartInfo.EnvironmentVariables'
], function(err, stdout, stderr) {
console.log(stdout);
});
如果要调试它,请确保先查看err
和stderr
。
用SomeProcess
代替notepad
对我有用,但是使用notepad.exe
无效。
在powershell上,您可以使用Get-Process [process name]
获得具有特定名称的进程。
例如,如果我有四个记事本实例正在运行并执行Get-Process notepad
,我将看到以下内容:
您可以使用(Get-Process notepad).Id
获取进程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
替换为您的进程名称。
答案 2 :(得分:1)
简便的方法(从here开始,您可以使用类似shelljs的方法,然后运行:
ps faux | grep 'PROCESS_NAME'
然后提取进程ID(我正在处理正则表达式),然后执行以下操作:
cat /proc/THE_PROCESS/environ | tr '\0' '\n'
您将把env vars返回为类似以下的字符串:
THEVAR=1
ANOTHERVAR=2
我认为您只是用'\ n'分割了字符串,但我正在检查!
一旦找到正则表达式,我将对其进行更新。 **您是在linux / mac还是Windows?
更新:检查https://github.com/shelljs/shx是否具有跨平台
答案 3 :(得分:0)
答案 4 :(得分:0)
javascript / nodejs中没有内置的方法可以做到这一点。如果确实需要这样做,那么最好的方法是在终端中运行命令,然后解析输出以构造所需的对象。