Nodejs - получает переменные окружения запущенного процесса - PullRequest
3 голосов
/ 07 октября 2019

Я пишу расширение для 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?

Ответы [ 5 ]

4 голосов
/ 07 октября 2019

Вы можете использовать модуль 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

2 голосов
/ 07 октября 2019

В сочетании с ответом @ 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].

Так, например, если у меня есть4 экземпляра блокнота работают и делают Get-Process notepad, я вижу это:

Processes

Вы можете получить идентификаторы процесса с помощью (Get-Process notepad).Id, который возвращает:

image

Вы можете использовать тот же код для выбора идентификатора:

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);
    }
);

^, который возвращает:

Return

Если вы просто хотите захватить первый процесс с именем, это:

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

^ очевидно, замените notepad с вашим именем процесса.

1 голос
/ 07 октября 2019

Простой способ (из здесь , вы можете использовать что-то вроде shelljs , затем запустите:

ps faux | grep 'PROCESS_NAME'

Затем извлеките идентификатор процесса (я просто работаюв регулярном выражении), а затем выполните:

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

Вы получите переменные env в виде строки, например:

THEVAR=1
ANOTHERVAR=2

Я полагаю, вы просто разбили строку на '\ n ', но я проверяю!

Я обновлю это, как только укажу регулярное выражение. ** Вы работаете в Linux / Mac или Windows?

ОБНОВЛЕНИЕ: Проверьте https://github.com/shelljs/shx для кроссплатформенной

0 голосов
/ 14 октября 2019

Нет встроенного способа сделать это в javascript / nodejs. Если вам действительно нужно это сделать, то лучше всего запустить команду в терминале, а затем проанализировать выходные данные, чтобы создать нужный вам объект.

0 голосов
/ 07 октября 2019

Да:

process.env даст вам то, что вам нужно:)

вы можете прочитать еще здесь .

РЕДАКТИРОВАТЬ : это даст вам переменные окружения только для процесса, который вы в ... я неправильно понял, и вы хотите вариации другого процесса?

...