Процесс
Объект process — это global, предоставляющий информацию о текущем процессе Node.js и управление им. Как глобальный объект, он всегда доступен приложениям Node.js без использования require().
События процесса
Объект process является экземпляром EventEmitter.
Событие: 'beforeExit'
Событие 'beforeExit' генерируется, когда Node.js очищает свой цикл событий и не имеет дополнительных задач для планирования. Обычно процесс Node.js завершается, когда нет запланированных задач, но обработчик, зарегистрированный на событии 'beforeExit', может выполнить асинхронные вызовы, тем самым заставив процесс Node.js продолжить работу.
Функция обратного вызова обработчика вызывается со значением process.exitCode в качестве единственного аргумента.
Событие 'beforeExit' не генерируется для условий, вызывающих явное завершение, таких как вызов process.exit() или необработанные исключения.
Событие 'beforeExit' не следует использовать в качестве альтернативы событию 'exit', если только не планируется выполнение дополнительных задач.
Событие: 'disconnect'
Если процесс Node.js запущен с каналом IPC (см. документацию по Процессам-детям и Кластеру), событие 'disconnect' будет сгенерировано при закрытии канала IPC.
Событие: 'exit'
Событие 'exit' генерируется, когда процесс Node.js собирается завершиться в результате:
- Явного вызова метода
process.exit(); - Отсутствия дополнительных задач для выполнения в цикле событий Node.js.
Нет способа предотвратить завершение цикла событий на этом этапе, и после завершения выполнения всех обработчиков события 'exit' процесс Node.js завершится.
Функция обратного вызова обработчика вызывается со значением кода завершения, указанного либо свойством process.exitCode, либо аргументом exitCode , переданным методу process.exit(), в качестве единственного аргумента.
Например:
process.on('exit', (code) => {
console.log(`About to exit with code: ${code}`);
});
Функции обработчика должны выполнять только синхронные операции. Процесс Node.js завершится сразу после вызова обработчиков события 'exit', что приведет к отказу от любых дополнительных задач, еще ожидающих выполнения в цикле событий. Например, в следующем примере таймаут никогда не произойдет:
process.on('exit', (code) => {
setTimeout(() => {
console.log('This will not run');
}, 0);
});
Событие: 'message'
Если процесс Node.js запущен с каналом IPC (см. документацию по Процессам-детям и Кластеру), событие 'message' генерируется всякий раз, когда сообщение, отправленное родительским процессом с помощью childprocess.send(), принимается дочерним процессом.
Функция обратного вызова обработчика вызывается со следующими аргументами:
-
message<Объект> разобранный JSON-объект или примитивное значение -
sendHandle<Объект-дескриптор> объектnet.Socketилиnet.Server, или undefined.
Событие: 'rejectionHandled'
Событие 'rejectionHandled' генерируется всякий раз, когда Promise отклонен, и обработчик ошибок был прикреплён к нему (например, с помощью promise.catch()) позже, чем за один оборот цикла событий Node.js.
Функция обратного вызова вызывается со ссылкой на отклоненный Promise в качестве единственного аргумента.
Объект Promise ранее был сгенерирован в событии 'unhandledRejection', но в процессе обработки получил обработчик отклонений.
Нет понятия верхнего уровня для цепочки Promise, в котором отклонения всегда могут быть обработаны. Будучи по своей сути асинхронными, отклонение Promise может быть обработано в будущий момент времени — возможно, намного позже, чем в цикле событий, в котором генерируется событие 'unhandledRejection'.
Другой способ сказать это: в отличие от синхронного кода, где существует постоянно растущий список необработанных исключений, в случае с обещаниями может быть растущий и сокращающийся список необработанных отклонений.
В синхронном коде событие 'uncaughtException' генерируется, когда список необработанных исключений увеличивается.
В асинхронном коде событие 'unhandledRejection' генерируется, когда список необработанных отклонений увеличивается, а событие 'rejectionHandled' генерируется, когда список необработанных отклонений уменьшается.
Например:
const unhandledRejections = new Map();
process.on('unhandledRejection', (reason, p) => {
unhandledRejections.set(p, reason);
});
process.on('rejectionHandled', (p) => {
unhandledRejections.delete(p);
});
В этом примере, список unhandledRejections Map будет расти и уменьшаться со временем, отражая отклонения, которые начинаются необработанными, а затем обрабатываются. Можно записывать такие ошибки в журнал ошибок, либо периодически (что, вероятно, лучше для долгоживущих приложений), либо при выходе процесса (что, вероятно, удобнее для скриптов).
Событие: 'uncaughtException'
Событие 'uncaughtException' генерируется, когда необработанное исключение JavaScript поднимается до цикла событий. По умолчанию Node.js обрабатывает такие исключения, выводит трассировку стека в stderr и завершается. Добавление обработчика для события 'uncaughtException' переопределяет это поведение по умолчанию.
Функция обработчика вызывается с объектом Error в качестве единственного аргумента.
Например:
process.on('uncaughtException', (err) => {
fs.writeSync(1, `Caught exception: ${err}`);
});
setTimeout(() => {
console.log('This will still run.');
}, 500);
// Intentionally cause an exception, but don't catch it.
nonexistentFunc();
console.log('This will not run.');
Предупреждение: Правильное использование 'uncaughtException'
Обратите внимание, что 'uncaughtException' — это примитивный механизм обработки исключений, который следует использовать только в крайнем случае. Событие не следует использовать как эквивалент On Error Resume Next. Необработанные исключения подразумевают, что приложение находится в неопределённом состоянии. Попытка возобновить работу приложения без надлежащей обработки исключения может привести к дополнительным непредвиденным и непредсказуемым проблемам.
Исключения, сгенерированные внутри обработчика события, не будут перехвачены. Вместо этого процесс завершится с ненулевым кодом выхода, и будет выведен стек вызовов. Это для предотвращения бесконечной рекурсии.
Попытка вернуться к нормальной работе после необработанного исключения может быть похожа на выдергивание шнура питания при модернизации компьютера — в девяти случаях из десяти ничего не происходит, но в десятый — система становится поврежденной.
Правильное использование 'uncaughtException' заключается в выполнении синхронной очистки выделенных ресурсов (например, дескрипторов файлов, дескрипторов, и т. д.) перед завершением процесса. После 'uncaughtException' невозможно безопасно продолжать нормальную работу.
Для более надежного перезапуска аварийного приложения, независимо от того, было ли сгенерировано событие uncaughtException или нет, следует использовать внешний монитор в отдельном процессе для обнаружения сбоев приложения и восстановления или перезапуска по мере необходимости.
Событие: 'unhandledRejection'
Событие 'unhandledRejection генерируется всякий раз, когда Promise отклоняется, и никакой обработчик ошибок не прикреплён к обещанию в рамках оборота цикла событий. При программировании с обещаниями исключения инкапсулированы как «отклоненные обещания». Отклонения могут быть перехвачены и обработаны с помощью promise.catch() и распространяются через цепочку Promise. Событие 'unhandledRejection' полезно для обнаружения и отслеживания обещаний, которые были отклонены, а их отклонения ещё не обработаны.
Функция обратного вызова вызывается со следующими аргументами:
-
reason<Ошибка> | <любое> Объект, с помощью которого обещание было отклонено (обычно объектError). -
pотклоненноеPromise.
Например:
process.on('unhandledRejection', (reason, p) => {
console.log('Unhandled Rejection at: Promise', p, 'reason:', reason);
// application specific logging, throwing an error, or other logic here
});
somePromise.then((res) => {
return reportToUser(JSON.pasre(res)); // note the typo (`pasre`)
}); // no `.catch` or `.then`
Следующее также вызовет событие 'unhandledRejection':
function SomeResource() {
// Initially set the loaded status to a rejected promise
this.loaded = Promise.reject(new Error('Resource not yet loaded!'));
}
const resource = new SomeResource();
// no .catch or .then on resource.loaded for at least a turn
В этом случае можно отслеживать отклонение как ошибку разработчика, как это обычно делается для других событий 'unhandledRejection'. Для устранения таких неполадок может быть прикреплён неактивный обработчик .catch(() => { }) к resource.loaded, что предотвратит генерацию события 'unhandledRejection'. В качестве альтернативы можно использовать событие 'rejectionHandled'.
Событие: 'warning'
Событие 'warning' генерируется всякий раз, когда Node.js генерирует предупреждение процесса.
Предупреждение процесса аналогично ошибке, поскольку оно описывает исключительные условия, о которых уведомляется пользователь. Однако предупреждения не входят в нормальный поток обработки ошибок Node.js и JavaScript. Node.js может генерировать предупреждения всякий раз, когда обнаруживает плохую практику программирования, которая может привести к низкой производительности приложения, ошибкам или уязвимостям безопасности.
Функция обработчика вызывается с единственным аргументом warning, значение которого является объектом Error. Существует три ключевых свойства, описывающих предупреждение:
-
name<строка> Название предупреждения (в настоящее времяWarningпо умолчанию). -
message<строка> Описание предупреждения, предоставленное системой. -
stack<строка> Трассировка стека до места в коде, где было выведено предупреждение.
process.on('warning', (warning) => {
console.warn(warning.name); // Print the warning name
console.warn(warning.message); // Print the warning message
console.warn(warning.stack); // Print the stack trace
});
По умолчанию Node.js будет выводить предупреждения процесса в stderr. Опцию командной строки --no-warnings можно использовать для подавления стандартного вывода в консоль, но событие 'warning' всё равно будет генерироваться объектом process.
Следующий пример иллюстрирует предупреждение, которое выводится в stderr при добавлении слишком большого числа слушателей к событию.
$ node
> events.defaultMaxListeners = 1;
> process.on('foo', () => {});
> process.on('foo', () => {});
> (node:38638) Warning: Possible EventEmitter memory leak detected. 2 foo
... listeners added. Use emitter.setMaxListeners() to increase limit
В отличие от этого, в следующем примере отключается вывод стандартных предупреждений и добавляется обработчик для события 'warning':
$ node --no-warnings
> var p = process.on('warning', (warning) => console.warn('Do not do that!'));
> events.defaultMaxListeners = 1;
> process.on('foo', () => {});
> process.on('foo', () => {});
> Do not do that!
Опция командной строки --trace-warnings может быть использована для включения в стандартный вывод предупреждений в консоль полного стека вызовов предупреждения.
Выдача пользовательских предупреждений
Метод process.emitWarning() можно использовать для выдачи пользовательских или специфичных для приложения предупреждений.
// Emit a warning using a string...
process.emitWarning('Something happened!');
// Prints: (node 12345) Warning: Something happened!
// Emit a warning using an object...
process.emitWarning('Something Happened!', 'CustomWarning');
// Prints: (node 12345) CustomWarning: Something happened!
// Emit a warning using a custom Error object...
class CustomWarning extends Error {
constructor(message) {
super(message);
this.name = 'CustomWarning';
Error.captureStackTrace(this, CustomWarning);
}
}
const myWarning = new CustomWarning('Something happened!');
process.emitWarning(myWarning);
// Prints: (node 12345) CustomWarning: Something happened!
Выдача пользовательских предупреждений об устаревании
Пользовательские предупреждения об устаревании можно выдать, установив свойство name пользовательского предупреждения в значение DeprecationWarning. Например:
process.emitWarning('This API is deprecated', 'DeprecationWarning');
Или,
const err = new Error('This API is deprecated');
err.name = 'DeprecationWarning';
process.emitWarning(err);
Запуск Node.js с флагом командной строки --throw-deprecation заставит пользовательские предупреждения об устаревании быть выброшены как исключения.
Использование флага командной строки --trace-deprecation заставит пользовательские предупреждения об устаревании выводиться в stderr вместе со стеком вызовов.
Использование флага командной строки --no-deprecation подавит весь вывод пользовательских предупреждений об устаревании.
Флаги командной строки *-deprecation влияют только на предупреждения, использующие имя DeprecationWarning.
События сигналов
События сигналов будут генерироваться, когда процесс Node.js получит сигнал. Обратитесь к signal(7) для списка стандартных имен сигналов POSIX, таких как SIGINT, SIGHUP, и т. д.
Имя каждого события будет соответствовать общепринятому имени сигнала в верхнем регистре (например, 'SIGINT' для сигналов SIGINT).
Например:
// Begin reading from stdin so the process does not exit.
process.stdin.resume();
process.on('SIGINT', () => {
console.log('Received SIGINT. Press Control-D to exit.');
});
Примечание: простой способ отправить сигнал SIGINT — это использование сочетания клавиш <Ctrl>-C в большинстве терминальных программ.
Важно отметить следующее:
-
SIGUSR1зарезервирован в Node.js для запуска отладчика. Можно установить слушатель, но это не остановит запуск отладчика. -
SIGTERMиSIGINTимеют обработчики по умолчанию на платформах, отличных от Windows, которые сбрасывают режим терминала перед завершением с кодом128 + signal number. Если для одного из этих сигналов установлен слушатель, его поведение по умолчанию будет удалено (Node.js больше не завершится). -
SIGPIPEигнорируется по умолчанию. Можно установить слушатель. -
SIGHUPгенерируется в Windows, когда окно консоли закрывается, и на других платформах в различных аналогичных ситуациях, см. signal(7). Можно установить слушателя, однако Node.js будет безусловно завершён Windows примерно через 10 секунд. На платформах, отличных от Windows, поведение по умолчаниюSIGHUPзаключается в завершении Node.js, но после установки слушателя его поведение по умолчанию будет удалено. -
SIGTERMне поддерживается в Windows, его можно прослушивать. -
SIGINTиз терминала поддерживается на всех платформах и обычно может быть сгенерирован с помощьюCTRL+C(хотя это может быть настраиваемо). Он не генерируется, когда режим терминала сырой. -
SIGBREAKдоставляется в Windows при нажатии<Ctrl>+<Break>, на платформах, отличных от Windows, его можно прослушивать, но нет способа его отправлять или генерировать. -
SIGWINCHдоставляется при изменении размера консоли. В Windows это произойдет только при записи в консоль при перемещении курсора или при использовании читаемого tty в сыром режиме. -
SIGKILLне может иметь установленного слушателя, он безусловно завершит Node.js на всех платформах. -
SIGSTOPне может иметь установленного слушателя. -
SIGBUS,SIGFPE,SIGSEGVиSIGILL, если они не были искусственно возбуждены с помощью kill(2), по своей природе оставляют процесс в состоянии, при котором небезопасно пытаться вызывать JS-слушатели. Это может привести к зависанию процесса в бесконечном цикле, так как слушатели, подключенные с помощьюprocess.on()вызываются асинхронно и, следовательно, не могут исправить основную проблему.
Примечание: Windows не поддерживает отправку сигналов, но Node.js предлагает некоторую эмуляцию с помощью process.kill() и subprocess.kill(). Отправка сигнала 0 может быть использована для проверки существования процесса. Отправка SIGINT, SIGTERM, и SIGKILL вызывает безусловное завершение целевого процесса.
process.abort()
Метод process.abort() заставляет процесс Node.js немедленно завершиться и сгенерировать файл core.
process.arch
Свойство process.arch возвращает строку, идентифицирующую архитектуру процессора операционной системы, для которой был скомпилирован двоичный файл Node.js.
Возможные значения: 'arm', 'arm64', 'ia32', 'mips', 'mipsel', 'ppc', 'ppc64', 's390', 's390x', 'x32', и 'x64'.
console.log(`This processor architecture is ${process.arch}`);
process.argv
Свойство process.argv возвращает массив, содержащий аргументы командной строки, переданные при запуске процесса Node.js. Первый элемент будет process.execPath. См. process.argv0 если требуется доступ к исходному значению argv[0].
Второй элемент — путь к исполняемому JavaScript-файлу. Остальные элементы — дополнительные аргументы командной строки.
Например, предположим следующий скрипт для process-args.js:
// print process.argv
process.argv.forEach((val, index) => {
console.log(`${index}: ${val}`);
});
Запуск процесса Node.js как:
$ node process-2.js one two=three four
Даст следующий вывод:
0: /usr/local/bin/node 1: /Users/mjr/work/node/process-2.js 2: one 3: two=three 4: four
process.argv0
Свойство process.argv0 хранит только для чтения копию исходного значения argv[0] , переданного при запуске Node.js.
$ bash -c 'exec -a customArgv0 ./node' > process.argv[0] '/Volumes/code/external/node/out/Release/node' > process.argv0 'customArgv0'
process.chdir(directory)
-
directory<строка>
Метод process.chdir() изменяет текущую рабочую директорию процесса Node.js или генерирует исключение, если это изменение не удается (например, если указанный directory не существует).
console.log(`Starting directory: ${process.cwd()}`);
try {
process.chdir('/tmp');
console.log(`New directory: ${process.cwd()}`);
} catch (err) {
console.error(`chdir: ${err}`);
}
process.config
Свойство process.config возвращает объект, содержащий JavaScript-представление опций конфигурации, используемых для компиляции текущего исполняемого файла Node.js. Это то же самое, что и файл config.gypi, который был создан при запуске скрипта ./configure.
Пример возможного вывода:
{
target_defaults:
{ cflags: [],
default_configuration: 'Release',
defines: [],
include_dirs: [],
libraries: [] },
variables:
{
host_arch: 'x64',
node_install_npm: 'true',
node_prefix: '',
node_shared_cares: 'false',
node_shared_http_parser: 'false',
node_shared_libuv: 'false',
node_shared_zlib: 'false',
node_use_dtrace: 'false',
node_use_openssl: 'true',
node_shared_openssl: 'false',
strict_aliasing: 'true',
target_arch: 'x64',
v8_use_snapshot: 'true'
}
}
Примечание: свойство process.config не является только для чтения, и в экосистеме существуют модули, которые, как известно, расширяют, изменяют или полностью заменяют значение process.config.
process.connected
Если процесс Node.js запущен с каналом IPC (см. документацию по процессам-потомкам и кластеризации), свойство process.connected вернёт true при подключенном канале IPC и вернёт false после вызова process.disconnect().
После того, как process.connected станет false, отправка сообщений через канал IPC с помощью process.send() больше невозможна.
process.cpuUsage([previousValue])
-
previousValue<Объект> Предыдущее возвращенное значение вызоваprocess.cpuUsage() - Возвращает: <Объект>
-
user<целое число> -
system<целое число>
-
Метод process.cpuUsage() возвращает использование процессорного времени пользователем и системой текущего процесса в объекте со свойствами user и system, значения которых представляют собой значения в микросекундах (миллионная доля секунды). Эти значения измеряют время, потраченное в пользовательском и системном коде соответственно, и могут оказаться больше фактического прошедшего времени, если несколько ядер процессора выполняют работу для этого процесса.
Результат предыдущего вызова process.cpuUsage() может быть передан в качестве аргумента функции для получения разностного значения.
const startUsage = process.cpuUsage();
// { user: 38579, system: 6986 }
// spin the CPU for 500 milliseconds
const now = Date.now();
while (Date.now() - now < 500);
console.log(process.cpuUsage(startUsage));
// { user: 514883, system: 11226 }
process.cwd()
- Возвращает: <строка>
Метод process.cwd() возвращает текущий рабочий каталог процесса Node.js.
console.log(`Current directory: ${process.cwd()}`);
process.disconnect()
Если процесс Node.js запущен с каналом IPC (см. документацию Процесс-потомка и Кластеризацию), метод process.disconnect() закроет канал IPC для родительского процесса, что позволит дочернему процессу выйти корректно, когда не будет других подключений, удерживающих его в живых.
Эффект вызова process.disconnect() такой же, как вызов метода ChildProcess.disconnect() родительского процесса.
Если процесс Node.js не был запущен с каналом IPC, process.disconnect() будет undefined.
process.env
Свойство process.env возвращает объект, содержащий пользовательскую среду. См. environ(7).
Пример такого объекта:
{
TERM: 'xterm-256color',
SHELL: '/usr/local/bin/bash',
USER: 'maciej',
PATH: '~/.bin/:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin',
PWD: '/Users/maciej',
EDITOR: 'vim',
SHLVL: '1',
HOME: '/Users/maciej',
LOGNAME: 'maciej',
_: '/usr/local/bin/node'
}
Изменить этот объект возможно, но такие изменения не будут отражены за пределами процесса Node.js. Другими словами, следующий пример не сработает:
$ node -e 'process.env.foo = "bar"' && echo $foo
В то время как следующий сработает:
process.env.foo = 'bar'; console.log(process.env.foo);
Присвоение свойства объекту process.env неявно преобразует значение в строку.
Пример:
process.env.test = null; console.log(process.env.test); // => 'null' process.env.test = undefined; console.log(process.env.test); // => 'undefined'
Используйте delete для удаления свойства из process.env.
Пример:
process.env.TEST = 1; delete process.env.TEST; console.log(process.env.TEST); // => undefined
В операционных системах Windows имена переменных окружения регистронезависимы.
Пример:
process.env.TEST = 1; console.log(process.env.test); // => 1
process.emitWarning(warning[, name][, ctor])
-
warning<строка> | <Ошибка> Предупреждение для отправки. -
name<строка> Когдаwarningявляется строкой,name— имя для использования в предупреждении. По умолчанию:Warning. -
ctor<Функция> Когдаwarningявляется строкой,ctor— необязательная функция, используемая для ограничения генерируемого отслеживания стека. По умолчаниюprocess.emitWarning
Метод process.emitWarning() может быть использован для отправки пользовательских или прикладных предупреждений процесса. Их можно прослушивать, добавив обработчик к событию process.on('warning').
// Emit a warning using a string...
process.emitWarning('Something happened!');
// Emits: (node: 56338) Warning: Something happened!
// Emit a warning using a string and a name...
process.emitWarning('Something Happened!', 'CustomWarning');
// Emits: (node:56338) CustomWarning: Something Happened!
В каждом из предыдущих примеров объект Error генерируется внутри process.emitWarning() и передаётся в событие process.on('warning').
process.on('warning', (warning) => {
console.warn(warning.name);
console.warn(warning.message);
console.warn(warning.stack);
});
Если warning передаётся как объект Error, он передаётся обработчику события process.on('warning') без изменений (и необязательные аргументы name и ctor игнорируются):
// Emit a warning using an Error object...
const myWarning = new Error('Warning! Something happened!');
myWarning.name = 'CustomWarning';
process.emitWarning(myWarning);
// Emits: (node:56338) CustomWarning: Warning! Something Happened!
Будет выброшена ошибка TypeError, если warning — что-либо кроме строки или объекта Error.
Обратите внимание, что, хотя предупреждения процесса используют объекты Error, механизм предупреждений процесса не является заменой обычным механизмам обработки ошибок.
В следующих случаях реализована дополнительная обработка, если предупреждение name — DeprecationWarning:
- Если используется командная строка
--throw-deprecation, предупреждение об устаревании выбрасывается как исключение, а не отправляется как событие. - Если используется командная строка
--no-deprecation, предупреждение об устаревании подавляется. - Если используется командная строка
--trace-deprecation, предупреждение об устаревании выводится вstderrвместе с полным отслеживанием стека.
Избегание дублирующих предупреждений
В качестве лучшей практики предупреждения должны выводиться только один раз на процесс. Для этого рекомендуется поместить emitWarning() за простой логический флаг, как показано в примере ниже:
let warned = false;
function emitMyWarning() {
if (!warned) {
process.emitWarning('Only warn once!');
warned = true;
}
}
emitMyWarning();
// Emits: (node: 56339) Warning: Only warn once!
emitMyWarning();
// Emits nothing
process.execArgv
Свойство process.execArgv возвращает набор параметров командной строки, специфичных для Node.js, переданных при запуске процесса Node.js. Эти параметры не отображаются в массиве, возвращаемом свойством process.argv, и не включают исполняемый файл Node.js, имя скрипта или параметры, следующие за именем скрипта. Эти параметры полезны для запуска дочерних процессов в той же среде выполнения, что и родительский.
Например:
$ node --harmony script.js --version
Результатом является process.execArgv:
['--harmony']
И process.argv:
['/usr/local/bin/node', 'script.js', '--version']
process.execPath
Свойство process.execPath возвращает абсолютный путь к исполняемому файлу, который запустил процесс Node.js.
Например:
'/usr/local/bin/node'
process.exit([code])
-
code<целое число> Код выхода. По умолчанию0.
Метод process.exit() инструктирует Node.js завершить процесс синхронно со статусом выхода code. Если code опущен, exit использует код 'успеха' 0 или значение process.exitCode, если оно установлено. Node.js не завершит работу, пока не будут вызваны все обработчики события 'exit'.
Для выхода с кодом 'ошибка':
process.exit(1);
Оболочка, которая выполнила Node.js, должна увидеть код выхода как 1.
Важно отметить, что вызов process.exit() заставит процесс завершиться как можно быстрее, даже если есть ожидающие завершения асинхронные операции, включая операции ввода-вывода в process.stdout и process.stderr.
В большинстве случаев явно вызывать process.exit() не нужно. Процесс Node.js завершится сам если в цикле событий нет дополнительной работы. Свойство process.exitCode может быть установлено, чтобы указать процессу код выхода при нормальном завершении.
Например, следующий пример демонстрирует неправильное использование метода process.exit(), которое может привести к обрезке и потере данных, выводимых в stdout:
// This is an example of what *not* to do:
if (someConditionNotMet()) {
printUsageToStdout();
process.exit(1);
}
Причина, по которой это проблематично, заключается в том, что записи в process.stdout в Node.js иногда асинхронны и могут выполняться в несколько циклов цикла событий Node.js. Однако вызов process.exit(), заставляет процесс завершиться до выполнения дополнительных записей в stdout.
Вместо прямого вызова process.exit(), код должен установить process.exitCode и позволить процессу выйти естественным путём, избегая планирования дополнительной работы в цикле событий:
// How to properly set the exit code while letting
// the process exit gracefully.
if (someConditionNotMet()) {
printUsageToStdout();
process.exitCode = 1;
}
Если необходимо завершить процесс Node.js из-за ошибки, выбрасывание неперехваченной ошибки и разрешение процессу завершиться соответственно безопаснее, чем вызов process.exit().
process.exitCode
Число, которое будет кодом выхода процесса, когда процесс завершается либо плавно, либо завершается с помощью process.exit() без указания кода.
Указание кода для process.exit(code) переопределит любое предыдущее значение process.exitCode.
process.getegid()
Метод process.getegid() возвращает числовой эффективный идентификатор группы процесса Node.js. (См. getegid(2).)
if (process.getegid) {
console.log(`Current gid: ${process.getegid()}`);
}
Примечание: Эта функция доступна только на платформах POSIX (т. е. не на Windows или Android).
process.geteuid()
- Возвращает: <Объект>
Метод process.geteuid() возвращает числовой эффективный идентификатор пользователя процесса. (См. geteuid(2).)
if (process.geteuid) {
console.log(`Current uid: ${process.geteuid()}`);
}
Примечание: Эта функция доступна только на платформах POSIX (т. е. не на Windows или Android).
process.getgid()
- Возвращает: <Объект>
Метод process.getgid() возвращает числовой идентификатор группы процесса. (См. getgid(2).)
if (process.getgid) {
console.log(`Current gid: ${process.getgid()}`);
}
Примечание: Эта функция доступна только на платформах POSIX (т. е. не на Windows или Android).
process.getgroups()
- Возвращает: <Массив>
Метод process.getgroups() возвращает массив с идентификаторами дополнительных групп. POSIX не указывает, включен ли в него идентификатор эффективной группы, но Node.js гарантирует, что он всегда включён.
Примечание: Эта функция доступна только на платформах POSIX (т.е. не на Windows или Android)
process.getuid()
- Возвращает: <целое число>
Метод process.getuid() возвращает числовой идентификатор пользователя процесса. (См. getuid(2).)
if (process.getuid) {
console.log(`Current uid: ${process.getuid()}`);
}
Примечание: Эта функция доступна только на платформах POSIX (т.е. не на Windows или Android)
process.hrtime([time])
Метод process.hrtime() возвращает текущее значение высокоточного реального времени в [seconds, nanoseconds] кортеже массива. time — необязательный параметр, который должен быть результатом предыдущего вызова process.hrtime() (и, следовательно, реального времени в [seconds, nanoseconds] кортеже массива, содержащем предыдущее время), для сравнения с текущим временем. Эти времена относительны к произвольному моменту в прошлом и не связаны с временем суток, поэтому не подвержены дрейфу часов. Основное применение — для измерения производительности между интервалами.
Передача результата предыдущего вызова process.hrtime() полезна для вычисления прошедшего времени между вызовами:
const time = process.hrtime();
// [ 1800216, 25 ]
setTimeout(() => {
const diff = process.hrtime(time);
// [ 1, 552 ]
console.log(`Benchmark took ${diff[0] * 1e9 + diff[1]} nanoseconds`);
// benchmark took 1000000527 nanoseconds
}, 1000);
Создание массива любым методом, кроме вызова process.hrtime() и передачи результата в process.hrtime(), приведёт к неопределённому поведению.
process.initgroups(user, extra_group)
-
user<строка> | <число> Имя пользователя или числовой идентификатор. -
extra_group<строка> | <число> Имя группы или числовой идентификатор.
Метод process.initgroups() считывает файл /etc/group и инициализирует список доступа к группам, используя все группы, членом которых является пользователь. Это привилегированная операция, требующая, чтобы у процесса Node.js был доступ root или возможность CAP_SETGID.
Обратите внимание на необходимость осторожности при снятии привилегий. Пример:
console.log(process.getgroups()); // [ 0 ]
process.initgroups('bnoordhuis', 1000); // switch user
console.log(process.getgroups()); // [ 27, 30, 46, 1000, 0 ]
process.setgid(1000); // drop root gid
console.log(process.getgroups()); // [ 27, 30, 46, 1000 ]
Примечание: Эта функция доступна только на платформах POSIX (т.е. не на Windows или Android)
process.kill(pid[, signal])
-
pid<число> Идентификатор процесса -
signal<строка> | <число> Сигнал для отправки, в виде строки или числа. По умолчанию'SIGTERM'.
Метод process.kill() отправляет signal процессу, идентифицированному по pid.
Имена сигналов — это строки, такие как 'SIGINT' или 'SIGHUP'. См. События сигналов и kill(2) для получения дополнительной информации.
Этот метод выдаст ошибку, если целевой pid не существует. В качестве особого случая, сигнал 0 может использоваться для проверки существования процесса. На платформах Windows будет выброшена ошибка, если pid используется для завершения группы процессов.
Примечание:Несмотря на название этой функции process.kill(), она фактически является просто отправителем сигналов, подобно системному вызову kill. Отправленный сигнал может выполнить действие, отличное от завершения целевого процесса.
Например:
process.on('SIGHUP', () => {
console.log('Got SIGHUP signal.');
});
setTimeout(() => {
console.log('Exiting.');
process.exit(0);
}, 100);
process.kill(process.pid, 'SIGHUP');
Примечание: При получении SIGUSR1 процессом Node.js, Node.js запустит отладчик, см. События сигналов.
process.mainModule
Свойство process.mainModule предоставляет альтернативный способ получения require.main. Различие заключается в том, что если основной модуль изменяется во время выполнения, require.main может всё ещё ссылаться на исходный основной модуль в модулях, которые были загружены до изменения. В целом, можно считать, что оба свойства ссылаются на один и тот же модуль.
Как и в случае с require.main, process.mainModule будет undefined в случае отсутствия скрипта входа.
process.memoryUsage()
- Возвращает: <Объект>
-
rss<целое число> -
heapTotal<целое число> -
heapUsed<целое число> -
external<целое число>
-
Метод process.memoryUsage() возвращает объект, описывающий использование памяти процессом Node.js, измеренное в байтах.
Например, код:
console.log(process.memoryUsage());
Сгенерирует:
{
rss: 4935680,
heapTotal: 1826816,
heapUsed: 650472,
external: 49879
}
heapTotal и heapUsed относятся к использованию памяти V8. external относится к использованию памяти объектами C++, связанными с объектами JavaScript, управляемыми V8. rss, Резидентный объём памяти, — это занимаемое в основной памяти устройство (которое является подмножеством общей выделенной памяти) процессом пространство, включающее кучу, сегмент кода и стек.
Куча — это место хранения объектов, строк и замыканий. Переменные хранятся в стеке, а фактический JavaScript-код находится в сегменте кода.
process.nextTick(callback[, ...args])
-
callback<Функция> -
...args<любой> Дополнительные аргументы для передачи при вызовеcallback
Метод process.nextTick() добавляет callback в очередь "следующей итерации". После завершения текущего цикла событий все колбэки в очереди следующей итерации будут вызваны.
Это не просто псевдоним для setTimeout(fn, 0). Он намного эффективнее. Он выполняется до запуска дополнительных событий ввода-вывода (включая таймеры) на последующих циклах событий.
console.log('start');
process.nextTick(() => {
console.log('nextTick callback');
});
console.log('scheduled');
// Output:
// start
// scheduled
// nextTick callback
Это важно при разработке API, чтобы предоставить пользователям возможность назначать обработчики событий после создания объекта, но до выполнения операций ввода-вывода:
function MyThing(options) {
this.setupOptions(options);
process.nextTick(() => {
this.startDoingStuff();
});
}
const thing = new MyThing();
thing.getReadyForStuff();
// thing.startDoingStuff() gets called now, not before.
Очень важно, чтобы API были либо 100% синхронными, либо 100% асинхронными. Рассмотрим этот пример:
// WARNING! DO NOT USE! BAD UNSAFE HAZARD!
function maybeSync(arg, cb) {
if (arg) {
cb();
return;
}
fs.stat('file', cb);
}
Это небезопасный API, поскольку в следующем случае:
const maybeTrue = Math.random() > 0.5;
maybeSync(maybeTrue, () => {
foo();
});
bar();
Неясно, какой колбэк foo() или bar() будет вызван первым.
Следующий подход намного лучше:
function definitelyAsync(arg, cb) {
if (arg) {
process.nextTick(cb);
return;
}
fs.stat('file', cb);
}
Примечание: очередь следующей итерации полностью очищается на каждом проходе цикла событий до обработки дополнительных операций ввода-вывода. В результате, рекурсивное задание колбэков nextTick заблокирует выполнение операций ввода-вывода, подобно циклу while(true);.
process.noDeprecation
Свойство process.noDeprecation указывает, установлена ли метка --no-deprecation в текущем процессе Node.js. См. документацию для warning события и emitWarning метода для получения дополнительной информации о поведении этой метки.
process.pid
Свойство process.pid возвращает PID процесса.
console.log(`This process is pid ${process.pid}`);
process.platform
Свойство process.platform возвращает строку, идентифицирующую платформу операционной системы, на которой работает процесс Node.js. Например, 'darwin', 'freebsd', 'linux', 'sunos' или 'win32'
console.log(`This platform is ${process.platform}`);
process.ppid
Свойство process.ppid возвращает PID родительского процесса.
console.log(`The parent process is pid ${process.ppid}`);
process.release
Свойство process.release возвращает объект, содержащий метаданные, связанные с текущим выпуском, включая URL для исходного tar-архива и tar-архива только заголовков.
process.release содержит следующие свойства:
-
name<строка> Значение, которое всегда будет'node'для Node.js. Для устаревших выпусков io.js это будет'io.js'. -
lts: строка со значением, указывающим имя кода LTS (Long-term Support) линии, к которой относится текущий выпуск. Это свойство существует только для LTS-выпусков и являетсяundefinedдля всех других типов выпусков, включая стабильные. Текущие допустимые значения:-
'Argon'для линии v4.x LTS, начиная с v4.2.0. -
'Boron'для линии v6.x LTS, начиная с v6.9.0.
-
-
sourceUrl<строка> абсолютный URL, указывающий на файл.tar.gz, содержащий исходный код текущего выпуска. -
headersUrl<строка> абсолютный URL, указывающий на файл.tar.gz, содержащий только исходные заголовочные файлы для текущего выпуска. Этот файл значительно меньше, чем полный исходный файл, и может использоваться для компиляции нативных дополнений Node.js. -
libUrl<строка> абсолютный URL, указывающий на файлnode.lib, соответствующий архитектуре и версии текущего выпуска. Этот файл используется для компиляции нативных дополнений Node.js. Это свойство присутствует только в Windows-версиях Node.js и отсутствует на всех других платформах. -
lts<строка> строковая метка, идентифицирующая метку LTS для данного выпуска. Если выпуск Node.js не является LTS-выпуском, это будетundefined.
Например:
{
name: 'node',
lts: 'Argon',
sourceUrl: 'https://nodejs.org/download/release/v4.4.5/node-v4.4.5.tar.gz',
headersUrl: 'https://nodejs.org/download/release/v4.4.5/node-v4.4.5-headers.tar.gz',
libUrl: 'https://nodejs.org/download/release/v4.4.5/win-x64/node.lib'
}
В пользовательских сборках из версий исходного дерева, не являющихся выпусками, может быть присутствовать только свойство name. Не следует полагаться на существование дополнительных свойств.
process.send(message[, sendHandle[, options]][, callback])
-
message<Объект> -
sendHandle<Объект-обработчик> -
options<Объект> -
callback<Функция> - Возвращает: <булево>
Если Node.js запущен с каналом IPC, метод process.send() может быть использован для отправки сообщений в родительский процесс. Сообщения будут получены как событие 'message' в объекте родительского процесса ChildProcess.
Если Node.js не был запущен с каналом IPC, process.send() будет undefined.
Примечание: Эта функция использует JSON.stringify() для сериализации message.
process.setegid(id)
Метод process.setegid() устанавливает эффективную идентичность группы процесса. (См. setegid(2).) id может быть передан в виде числового идентификатора или строкового имени группы. Если указано имя группы, этот метод блокируется во время разрешения соответствующего числового идентификатора.
if (process.getegid && process.setegid) {
console.log(`Current gid: ${process.getegid()}`);
try {
process.setegid(501);
console.log(`New gid: ${process.getegid()}`);
} catch (err) {
console.log(`Failed to set gid: ${err}`);
}
}
Примечание: Эта функция доступна только на платформах POSIX (т.е. не на Windows или Android)
process.seteuid(id)
Метод process.seteuid() устанавливает эффективную идентичность пользователя процесса. (См. seteuid(2).) id может быть передан в виде числового идентификатора или строки имени пользователя. Если указано имя пользователя, метод блокируется во время разрешения соответствующего числового идентификатора.
if (process.geteuid && process.seteuid) {
console.log(`Current uid: ${process.geteuid()}`);
try {
process.seteuid(501);
console.log(`New uid: ${process.geteuid()}`);
} catch (err) {
console.log(`Failed to set uid: ${err}`);
}
}
Примечание: Эта функция доступна только на платформах POSIX (т.е. не на Windows или Android)
process.setgid(id)
Метод process.setgid() устанавливает идентичность группы процесса. (См. setgid(2).) id может быть передан в виде числового идентификатора или строкового имени группы. Если указано имя группы, этот метод блокируется во время разрешения соответствующего числового идентификатора.
if (process.getgid && process.setgid) {
console.log(`Current gid: ${process.getgid()}`);
try {
process.setgid(501);
console.log(`New gid: ${process.getgid()}`);
} catch (err) {
console.log(`Failed to set gid: ${err}`);
}
}
Примечание: Эта функция доступна только на платформах POSIX (т.е. не на Windows или Android)
process.setgroups(groups)
-
groups<Массив>
Метод process.setgroups() устанавливает дополнительные идентификаторы групп для процесса Node.js. Это привилегированная операция, которая требует, чтобы процесс Node.js имел root или CAP_SETGID возможность.
Массив groups может содержать числовые идентификаторы групп, имена групп или оба.
Примечание: Эта функция доступна только на платформах POSIX (т.е. не на Windows или Android)
process.setuid(id)
Метод process.setuid(id) устанавливает идентичность пользователя процесса. (См. setuid(2).) id может быть передан в виде числового идентификатора или строки имени пользователя. Если указано имя пользователя, метод блокируется во время разрешения соответствующего числового идентификатора.
if (process.getuid && process.setuid) {
console.log(`Current uid: ${process.getuid()}`);
try {
process.setuid(501);
console.log(`New uid: ${process.getuid()}`);
} catch (err) {
console.log(`Failed to set uid: ${err}`);
}
}
Примечание: Эта функция доступна только на платформах POSIX (т.е. не на Windows или Android)
process.stderr
Свойство process.stderr возвращает поток, подключенный к stderr (fd 2). Это net.Socket (который является потоком Duplex), если fd 2 относится к файлу, в этом случае это поток Writable.
Примечание: process.stderr отличается от других потоков Node.js важными способами, см. примечание о потоках ввода-вывода процесса для получения дополнительной информации.
process.stdin
Свойство process.stdin возвращает поток, подключенный к stdin (fd 0). Это net.Socket (который является потоком Duplex), если fd 0 относится к файлу, в этом случае это поток Readable.
Например:
process.stdin.setEncoding('utf8');
process.stdin.on('readable', () => {
const chunk = process.stdin.read();
if (chunk !== null) {
process.stdout.write(`data: ${chunk}`);
}
});
process.stdin.on('end', () => {
process.stdout.write('end');
});
В качестве потока Duplex, process.stdin также может быть использован в "старом" режиме, совместимом со скриптами, написанными для Node.js до версии v0.10. Для получения дополнительной информации см. Совместимость потоков.
Примечание: В режиме "старых" потоков поток stdin приостановлен по умолчанию, поэтому необходимо вызвать process.stdin.resume() для чтения из него. Также обратите внимание, что вызов самого process.stdin.resume() переключит поток в "старый" режим.
process.stdout
Свойство process.stdout возвращает поток, подключенный к stdout (fd 1). Это net.Socket (который является потоком Duplex), если fd 1 относится к файлу, в этом случае это поток Writable.
Например, чтобы скопировать process.stdin в process.stdout:
process.stdin.pipe(process.stdout);
Примечание: process.stdout отличается от других потоков Node.js важными способами, см. примечание о потоках ввода-вывода процесса для получения дополнительной информации.
Примечание о потоках ввода-вывода процесса
process.stdout и process.stderr отличаются от других потоков Node.js важными способами:
- Они используются внутри
console.log()иconsole.error(), соответственно. - Их нельзя закрыть (
end()выбросит ошибку). - Они никогда не будут генерировать событие
'finish'. - Записи могут быть синхронными в зависимости от того, к чему подключён поток, и от того, Windows или POSIX система:
- Файлы: синхронные в Windows и POSIX
- TTY (терминалы): асинхронные в Windows, синхронные в POSIX
- Паровые трубы (и сокеты): синхронные в Windows, асинхронные в POSIX
Эти особенности частично обусловлены историческими причинами, так как изменение их привело бы к несовместимости с предыдущими версиями, но они также ожидаются некоторыми пользователями.
Синхронные записи избегают проблем, таких как неожиданное переплетение вывода, записанного с помощью console.log() или console.error(), или его отсутствие, если process.exit() вызывается до завершения асинхронной записи. См. process.exit() для получения дополнительной информации.
Предупреждение: Синхронные записи блокируют цикл событий до завершения записи. В случае вывода в файл это может быть почти мгновенно, но при высокой нагрузке системы, при отсутствии чтения из пайпа на принимающей стороне, или при медленных терминалах или файловых системах, цикл событий может блокироваться достаточно часто и достаточно долго, что окажет сильное негативное влияние на производительность. Это может не быть проблемой при записи в интерактивную сессию терминала, но учтите это особенно внимательно при выполнении производственной регистрации в потоках вывода процесса.
Чтобы проверить, подключен ли поток к контексту TTY, проверьте свойство isTTY.
Например:
$ node -p "Boolean(process.stdin.isTTY)" true $ echo "foo" | node -p "Boolean(process.stdin.isTTY)" false $ node -p "Boolean(process.stdout.isTTY)" true $ node -p "Boolean(process.stdout.isTTY)" | cat false
См. документацию TTY для получения дополнительной информации.
process.throwDeprecation
Свойство process.throwDeprecation указывает, установлена ли метка --throw-deprecation в текущем процессе Node.js. См. документацию события warning и метод emitWarning для получения дополнительной информации о поведении этой метки.
process.title
Свойство process.title возвращает текущее название процесса (т.е. возвращает текущее значение ps). Присвоение нового значения process.title изменяет текущее значение ps.
Примечание: При присвоении нового значения разные платформы могут накладывать разные ограничения на максимальную длину названия. Обычно такие ограничения довольно ограничены. Например, в Linux и macOS process.title ограничено размером имени исполняемого файла плюс длиной аргументов командной строки, поскольку установка process.title перезаписывает память argv процесса. Node.js v0.8 допускал более длинные строки названия процесса, также перезаписывая память environ, но это потенциально было небезопасно и вызывало путаницу в некоторых (довольно запутанных) случаях.
process.traceDeprecation
Свойство process.traceDeprecation указывает, установлена ли метка --trace-deprecation в текущем процессе Node.js. См. документацию события warning и метода emitWarning для получения дополнительной информации о поведении этой метки.
process.umask([mask])
-
mask<number>
Метод process.umask() устанавливает или возвращает маску создания режима доступа к файлам процесса Node.js. Дочерние процессы наследуют маску от родительского процесса. При вызове без аргумента возвращается текущая маска, в противном случае маска устанавливается в значение аргумента, а возвращается предыдущая маска.
const newmask = 0o022;
const oldmask = process.umask(newmask);
console.log(
`Changed umask from ${oldmask.toString(8)} to ${newmask.toString(8)}`
);
process.uptime()
- Возвращает: <number>
Метод process.uptime() возвращает количество секунд, в течение которых текущий процесс Node.js работает.
Примечание: возвращаемое значение включает дробную часть секунды. Используйте Math.floor() для получения целого количества секунд.
process.version
Свойство process.version возвращает строку версии Node.js.
console.log(`Version: ${process.version}`);
process.versions
Свойство process.versions возвращает объект, перечисляющий строки версий Node.js и его зависимостей. process.versions.modules указывает текущую ABI-версию, которая увеличивается всякий раз, когда изменяется C++ API. Node.js откажется загружать модули, скомпилированные с использованием другой версии модульного ABI.
console.log(process.versions);
Сгенерирует объект, подобный:
{
http_parser: '2.3.0',
node: '1.1.1',
v8: '4.1.0.14',
uv: '1.3.0',
zlib: '1.2.8',
ares: '1.10.0-DEV',
modules: '43',
icu: '55.1',
openssl: '1.0.1k'
}
Коды выхода
Обычно Node.js завершается со статусом 0 при отсутствии ожидающих асинхронных операций. В других случаях используются следующие коды выхода:
-
1Необработанное критическое исключение - Произошло необработанное исключение, и оно не было обработано доменом или обработчиком события'uncaughtException'. -
2- Не используется (зарезервировано Bash для неправильного использования встроенных функций) -
3Внутренняя ошибка парсинга JavaScript - Внутренний код JavaScript в процессе загрузки Node.js вызвал ошибку синтаксического анализа. Это крайне редко, и, как правило, может произойти только во время разработки самого Node.js. -
4Внутренняя ошибка вычисления JavaScript - Внутренний код JavaScript в процессе загрузки Node.js не смог вернуть значение функции при вычислении. Это крайне редко, и, как правило, может произойти только во время разработки самого Node.js. -
5Критическая ошибка - Произошла необработанная и невосстановимая ошибка в V8. Обычно сообщение будет выведено в stderr с префиксомFATAL ERROR. -
6Нефункциональный обработчик внутренних исключений - Произошло необработанное исключение, но внутренняя функция обработки критических исключений была как-то установлена в не функцию и не могла быть вызвана. -
7Ошибка во время работы внутреннего обработчика исключений - Произошло необработанное исключение, и сама внутренняя функция обработки критических исключений выбросила ошибку при попытке обработать его. Это может произойти, например, если'uncaughtException'или обработчикdomain.on('error')выбросил ошибку. -
8- Не используется. В предыдущих версиях Node.js код выхода 8 иногда указывал на необработанное исключение. -
9- Неверный аргумент - Была указана неизвестная опция или опция, требующая значения, была предоставлена без значения. -
10Внутренняя ошибка выполнения JavaScript - Внутренний код JavaScript в процессе загрузки Node.js выбросил ошибку при вызове функции загрузки. Это крайне редко, и, как правило, может произойти только во время разработки самого Node.js. -
12Неверный аргумент отладки - Опции--debug,--inspectи/или--debug-brkбыли установлены, но выбранный номер порта был неверным или недоступным. -
>128Завершение по сигналам - Если Node.js получит критический сигнал, такой какSIGKILLилиSIGHUP, его код выхода будет128плюс значение кода сигнала. Это стандартная практика POSIX, поскольку коды выхода определены как целые числа с 7 битами, а сигнальные завершения устанавливают старший бит, а затем содержат значение кода сигнала.
© Joyent, Inc. and other Node contributors
Licensed under the MIT License.
Node.js is a trademark of Joyent, Inc. and is used with its permission.
We are not endorsed by or affiliated with Joyent.
https://nodejs.org/dist/latest-v6.x/docs/api/process.html