Интерпретация модуля процесса Node.js

Node.js Командная строка JavaScript V8

Процесс существует в глобальном объекте и может использоваться без использования require() для загрузки.Модуль процесса в основном делает две вещи

  • Получить информацию о процессе (использование ресурсов, рабочая среда, рабочий статус)
  • Выполнение операций процесса (прослушивание событий, планирование задач, выдача предупреждений)

использование ресурса

Использование ресурсов относится к ресурсам компьютера, потребляемым при выполнении этого процесса. такие как память, процессор

ОЗУ

process.memoryUsage())

{ rss: 21848064,
  heapTotal: 7159808,
  heapUsed: 4431688,
  external: 8224 
 }

Состав rss (резидентной памяти) показан на следующем рисунке

сегмент кода соответствует текущему выполняемому коду

Внешний соответствует памяти объектов C ++ (связывание с объектами управления V8 JS), таких как использование буфера

Buffer.allocUnsafe(1024 * 1024 * 1000);
console.log(process.memoryUsage());

{ rss: 22052864,
  heapTotal: 6635520,
  heapUsed: 4161376,
  external: 1048584224 }

cpu

const startUsage = process.cpuUsage();
console.log(startUsage);

const now = Date.now();
while (Date.now() - now < 500);

console.log(process.cpuUsage());
console.log(process.cpuUsage(startUsage)); //相对时间

// { user: 59459, system: 18966 }
// { user: 558135, system: 22312 }
// { user: 498432, system: 3333 }

user соответствует пользовательскому времени, system представляет системное время

Рабочая среда

Рабочая среда относится к среде хоста, в которой выполняется процесс, включая рабочий каталог, среду узла, архитектуру ЦП, пользовательскую среду и системную платформу.

запустить каталог

console.log(`Current directory: ${process.cwd()}`);

// Current directory: /Users/xxxx/workspace/learn/node-basic/process

среда узла

console.log(process.version)

// v9.1.0

Если вы хотите получить не только информацию о версии узла, но и версию v8, zlib, libuv и т. д., вам необходимо использовать process.versions

console.log(process.versions);
{ http_parser: '2.7.0',
  node: '9.1.0',
  v8: '6.2.414.32-node.8',
  uv: '1.15.0',
  zlib: '1.2.11',
  ares: '1.13.0',
  modules: '59',
  nghttp2: '1.25.0',
  openssl: '1.0.2m',
  icu: '59.1',
  unicode: '9.0',
  cldr: '31.0.1',
  tz: '2017b' }

Архитектура CPU

console.log(`This processor architecture is ${process.arch}`);

// This processor architecture is x64

Поддерживаемые значения включают:'arm', 'arm64', 'ia32', 'mips', 'mipsel', 'ppc', 'ppc64', 's390', 's390x', 'x32' 'x64'

Пользовательская среда

console.log(process.env.NODE_ENV); // dev

NODE_ENV=dev node b.js

В дополнение к пользовательской информации при запуске, process.env также может получать другую информацию о пользовательской среде (например, PATH, SHELL, HOME и т. д.), если вам интересно, вы можете распечатать ее и попробовать самостоятельно.

системная платформа

console.log(`This platform is ${process.platform}`);

This platform is darwin

Поддерживаемые системные платформы включают:'aix' 'darwin' 'freebsd' 'linux' 'openbsd' 'sunos' 'win32'

андроид все еще находится в экспериментальной стадии

Рабочий статус

Состояние выполнения относится к информации, связанной с выполнением текущего процесса, включая параметры запуска, каталог выполнения, основной файл, информацию PID, время выполнения.

параметры запуска

Есть три способа получить аргументы запуска: execArgv получает параметры командной строки Node.js (см.Официальная документация сайта)

argv получает информацию об опциях, не относящихся к командной строке, а argv0 получает значение argv[0] (немного отличается)

console.log(process.argv)
console.log(process.argv0)
console.log(process.execArgv)

node --harmony  b.js foo=bar --version

// 输出结果
[ '/Users/xiji/.nvm/versions/node/v9.1.0/bin/node',
  '/Users/xiji/workspace/learn/node-basic/process/b.js',
  'foo=bar',
  '--version' ]
node
[ '--harmony' ]

каталог выполнения

console.log(process.execPath);

// /Users/xxxx/.nvm/versions/node/v9.1.0/bin/node

часы работы

var date = new Date();
while(new Date() - date < 500) {}
console.log(process.uptime()); // 0.569

основной файл

В дополнение к require.main вы также можете использовать process.mainModule, чтобы определить, является ли модуль основным файлом.

//a.js
console.log(`module A: ${process.mainModule === module}`);

//b.js
require('./a');
console.log(`module B: ${process.mainModule === module}`);

node b.js
// 输出
module A: false
module B: true

PID-информация

console.log(`This process is pid ${process.pid}`); //This process is pid 12554

прослушать событие

process является экземпляром объекта EventEmiiter, поэтому вы можете использовать process.on('eventName', () => {}) для прослушивания событий. Существует два распространенных типа событий:

  • Статус процесса, такой как: beforeExit, выход, uncaughtException, сообщение
  • Сигнальные события, такие как: SIGTERM, SIGKILL, SIGUSR1

Есть два различия между beforeExit и exit:

  • Асинхронный код может быть выполнен в beforeExit, а выход может быть только синхронным кодом.
  • Вызов process.exit() вручную или запуск uncaptException не вызовет событие beforeExit, но событие выхода вызовет выход процесса.

Таким образом, следующая консоль кода не будет выполнена

process.on('beforeExit', function(code) {
  console.log('before exit: '+ code);
});
process.on('exit', function(code) {
  setTimeout(function() {
    console.log('exit: ' + code);
  }, 0);
});
a.b();

Если исключение не было перехвачено и обработано, в конечном итоге будет запущено событие uncaughtException. По умолчанию Node.js выводит информацию о стеке в stderr, а затем завершает процесс. Не пытайтесь предотвратить выход uncaughtException из процесса, так как в это время состояние программы может быть нестабильным.Рекомендуемый способ — вовремя отлавливать ошибки в коде обработки, а в uncaughtException выполнять только некоторую очистку.

Примечание. В версии узла 9.3 добавлен метод process.setUncaughtExceptionCaptureCallback.

Когда process.setUncaughtExceptionCaptureCallback(fn) указывает функцию прослушивателя, событие uncaughtException больше не будет запускаться.

process.on('uncaughtException', function() {
  console.log('uncaught listener');
});

process.setUncaughtExceptionCaptureCallback(function() {
  console.log('uncaught fn');
});

a.b();
// uncaught fn

message подходит для отправки сообщений между родительским и дочерним процессами.Подробнее о том, как создать родительский и дочерний процессы, см.Интерпретация модуля child_process.

Хотя сигнал SIGTERM также используется для запроса завершения процесса Node.js, он отличается от сигнала SIGKILL. Процесс может ответить на этот сигнал или проигнорировать его. SIGTERM завершит процесс дружественным образом, освободив выделенные ресурсы (например, соединения с базой данных) до того, как процесс завершится, поэтому этот метод называется изящным завершением работы (graceful shutdown). Конкретные этапы выполнения следующие:

  • Приложение получает уведомление о том, что его необходимо закрыть (получает сигнал SIGTERM)
  • Приложение сообщает балансировщику нагрузки, что больше не принимает новые запросы
  • Приложение завершает незавершенный запрос
  • Освободить ресурсы (например, соединения с базой данных)
  • Приложение нормально завершает работу с кодом выхода 0

SIGUSR1 Node.js запускает встроенный отладчик при получении сигнала SIGUSR1, когда он выполняет следующие действия.

kill -USR1 PID_OF_THE_NODE_JS_PROCESS

Вы можете видеть, что node.js запустит агент отладчика, порт 9229.

server is listening 8089
Debugger listening on ws://127.0.0.1:9229/7ef98ccb-02fa-451a-8954-4706bd74105f
For help, see: https://nodejs.org/en/docs/inspector

Вы также можете использовать --inspect для запуска агента отладки при запуске службы.

node --inspect index.js

Расписание задач

process.nextTick(fn)

Задачи, запланированные process.nextTick, являются асинхронными задачами, EventLoop поэтапный, каждый этап выполняет определенную задачу, а задача nextTick будет выполняться при переключении этапа, поэтому nextTick будет быстрее, чем setTimeout(fn, 0) для выполнение EventLoop, см. рисунок ниже, который будет подробно объяснен позже.

предупреждение

process.emitWarning('Something warning happened!', {
  code: 'MY_WARNING',
  type: 'XXXX'
});

// (node:14771) [MY_WARNING] XXXX: Something warning happened!

Если тип — DeprecationWarning, на него могут повлиять параметры командной строки.

  • --throw-deprecationвызовет исключение
  • --no-deprecationНе выводить предупреждение об устаревании
  • --trace-deprecationПечать подробной информации о стеке
process.emitWarning('Something warning happened!', {
  type: 'DeprecationWarning'
});
console.log(4);

node --throw-deprecation index.js
node --no-deprecation index.js
node --trace-deprecation index.js

использованная литература

blog.rising stack.com/mastering - он…