プロセス#

ソースコード: lib/process.js

process オブジェクトは、現在の Node.js プロセスの情報と制御を提供します。

import process from 'node:process';const process = require('node:process');

プロセスイベント#

process オブジェクトは、EventEmitter のインスタンスです。

イベント: `'beforeExit'`#

`'beforeExit'` イベントは、Node.js がイベントループを空にし、スケジュールする追加の作業がない場合に発生します。通常、Node.js プロセスはスケジュールされた作業がないと終了しますが、`'beforeExit'` イベントに登録されたリスナーは非同期呼び出しを行うことができ、それによって Node.js プロセスの継続を引き起こす可能性があります。

リスナーのコールバック関数は、process.exitCode の値を引数として呼び出されます。

`'beforeExit'` イベントは、process.exit() の呼び出しやキャッチされない例外など、明示的な終了を引き起こす条件に対しては発生しません

`'beforeExit'` は、追加の作業をスケジュールする意図がない限り、`'exit'` イベントの代替として使用しないでください

import process from 'node:process';

process.on('beforeExit', (code) => {
  console.log('Process beforeExit event with code: ', code);
});

process.on('exit', (code) => {
  console.log('Process exit event with code: ', code);
});

console.log('This message is displayed first.');

// Prints:
// This message is displayed first.
// Process beforeExit event with code: 0
// Process exit event with code: 0const process = require('node:process');

process.on('beforeExit', (code) => {
  console.log('Process beforeExit event with code: ', code);
});

process.on('exit', (code) => {
  console.log('Process exit event with code: ', code);
});

console.log('This message is displayed first.');

// Prints:
// This message is displayed first.
// Process beforeExit event with code: 0
// Process exit event with code: 0

イベント: `'disconnect'`#

Node.js プロセスが IPC チャネルを使用して生成された場合(子プロセスクラスタ のドキュメントを参照)、IPC チャネルが閉じられたときに `'disconnect'` イベントが発生します。

イベント: `'exit'`#

`'exit'` イベントは、次のいずれかの結果として Node.js プロセスが終了しようとしている場合に発生します。

  • process.exit() メソッドが明示的に呼び出された場合。
  • Node.js イベントループに実行する追加の作業がなくなった場合。

この時点でイベントループの終了を防ぐ方法はなく、すべての `'exit'` リスナーの実行が完了すると、Node.js プロセスは終了します。

リスナーのコールバック関数は、process.exitCode プロパティ、または process.exit() メソッドに渡された exitCode 引数によって指定された終了コードを使用して呼び出されます。

import process from 'node:process';

process.on('exit', (code) => {
  console.log(`About to exit with code: ${code}`);
});const process = require('node:process');

process.on('exit', (code) => {
  console.log(`About to exit with code: ${code}`);
});

リスナー関数は、同期操作のみを実行する必要があります。Node.js プロセスは、`'exit'` イベントリスナーを呼び出した直後に終了するため、イベントループにまだキューイングされている追加の作業は放棄されます。たとえば、次の例では、タイムアウトは発生しません。

import process from 'node:process';

process.on('exit', (code) => {
  setTimeout(() => {
    console.log('This will not run');
  }, 0);
});const process = require('node:process');

process.on('exit', (code) => {
  setTimeout(() => {
    console.log('This will not run');
  }, 0);
});

イベント: `'message'`#

Node.js プロセスが IPC チャネルを使用して生成された場合(子プロセスクラスタ のドキュメントを参照)、childprocess.send() を使用して親プロセスによって送信されたメッセージが子プロセスによって受信されるたびに、`'message'` イベントが発生します。

メッセージはシリアライズとパースを経ます。結果として得られるメッセージは、最初に送信されたものとは異なる場合があります。

プロセスの生成時に `serialization` オプションが `advanced` に設定されていた場合、`message` 引数には JSON が表現できないデータが含まれる可能性があります。詳細については、child_process の高度なシリアライゼーション を参照してください。

イベント: `'multipleResolves'`#

安定性: 0 - 非推奨

  • type <文字列> 解決タイプ。'resolve' または 'reject' のいずれか。
  • promise <Promise> 複数回解決または拒否された Promise。
  • value <任意> 元の解決後に Promise が解決または拒否された値。

`'multipleResolves'` イベントは、Promise が次のいずれかの場合に発生します。

  • 複数回解決された場合。
  • 複数回拒否された場合。
  • 解決後に拒否された場合。
  • 拒否後に解決された場合。

This is useful for tracking potential errors in an application while using the Promise constructor, as multiple resolutions are silently swallowed. However, the occurrence of this event does not necessarily indicate an error. For example, Promise.race() can trigger a 'multipleResolves' event.

Because of the unreliability of the event in cases like the Promise.race() example above it has been deprecated.

import process from 'node:process';

process.on('multipleResolves', (type, promise, reason) => {
  console.error(type, promise, reason);
  setImmediate(() => process.exit(1));
});

async function main() {
  try {
    return await new Promise((resolve, reject) => {
      resolve('First call');
      resolve('Swallowed resolve');
      reject(new Error('Swallowed reject'));
    });
  } catch {
    throw new Error('Failed');
  }
}

main().then(console.log);
// resolve: Promise { 'First call' } 'Swallowed resolve'
// reject: Promise { 'First call' } Error: Swallowed reject
//     at Promise (*)
//     at new Promise (<anonymous>)
//     at main (*)
// First callconst process = require('node:process');

process.on('multipleResolves', (type, promise, reason) => {
  console.error(type, promise, reason);
  setImmediate(() => process.exit(1));
});

async function main() {
  try {
    return await new Promise((resolve, reject) => {
      resolve('First call');
      resolve('Swallowed resolve');
      reject(new Error('Swallowed reject'));
    });
  } catch {
    throw new Error('Failed');
  }
}

main().then(console.log);
// resolve: Promise { 'First call' } 'Swallowed resolve'
// reject: Promise { 'First call' } Error: Swallowed reject
//     at Promise (*)
//     at new Promise (<anonymous>)
//     at main (*)
// First call

Event: 'rejectionHandled'#

  • promise <Promise> The late handled promise.

The 'rejectionHandled' event is emitted whenever a Promise has been rejected and an error handler was attached to it (using promise.catch(), for example) later than one turn of the Node.js event loop.

The Promise object would have previously been emitted in an 'unhandledRejection' event, but during the course of processing gained a rejection handler.

There is no notion of a top level for a Promise chain at which rejections can always be handled. Being inherently asynchronous in nature, a Promise rejection can be handled at a future point in time, possibly much later than the event loop turn it takes for the 'unhandledRejection' event to be emitted.

Another way of stating this is that, unlike in synchronous code where there is an ever-growing list of unhandled exceptions, with Promises there can be a growing-and-shrinking list of unhandled rejections.

In synchronous code, the 'uncaughtException' event is emitted when the list of unhandled exceptions grows.

In asynchronous code, the 'unhandledRejection' event is emitted when the list of unhandled rejections grows, and the 'rejectionHandled' event is emitted when the list of unhandled rejections shrinks.

import process from 'node:process';

const unhandledRejections = new Map();
process.on('unhandledRejection', (reason, promise) => {
  unhandledRejections.set(promise, reason);
});
process.on('rejectionHandled', (promise) => {
  unhandledRejections.delete(promise);
});const process = require('node:process');

const unhandledRejections = new Map();
process.on('unhandledRejection', (reason, promise) => {
  unhandledRejections.set(promise, reason);
});
process.on('rejectionHandled', (promise) => {
  unhandledRejections.delete(promise);
});

In this example, the unhandledRejections Map will grow and shrink over time, reflecting rejections that start unhandled and then become handled. It is possible to record such errors in an error log, either periodically (which is likely best for long-running application) or upon process exit (which is likely most convenient for scripts).

Event: 'uncaughtException'#

  • err <Error> The uncaught exception.
  • origin <string> Indicates if the exception originates from an unhandled rejection or from a synchronous error. Can either be 'uncaughtException' or 'unhandledRejection'. The latter is used when an exception happens in a Promise based async context (or if a Promise is rejected) and --unhandled-rejections flag set to strict or throw (which is the default) and the rejection is not handled, or when a rejection happens during the command line entry point's ES module static loading phase.

The 'uncaughtException' event is emitted when an uncaught JavaScript exception bubbles all the way back to the event loop. By default, Node.js handles such exceptions by printing the stack trace to stderr and exiting with code 1, overriding any previously set process.exitCode. Adding a handler for the 'uncaughtException' event overrides this default behavior. Alternatively, change the process.exitCode in the 'uncaughtException' handler which will result in the process exiting with the provided exit code. Otherwise, in the presence of such handler the process will exit with 0.

import process from 'node:process';
import fs from 'node:fs';

process.on('uncaughtException', (err, origin) => {
  fs.writeSync(
    process.stderr.fd,
    `Caught exception: ${err}\n` +
    `Exception origin: ${origin}\n`,
  );
});

setTimeout(() => {
  console.log('This will still run.');
}, 500);

// Intentionally cause an exception, but don't catch it.
nonexistentFunc();
console.log('This will not run.');const process = require('node:process');
const fs = require('node:fs');

process.on('uncaughtException', (err, origin) => {
  fs.writeSync(
    process.stderr.fd,
    `Caught exception: ${err}\n` +
    `Exception origin: ${origin}\n`,
  );
});

setTimeout(() => {
  console.log('This will still run.');
}, 500);

// Intentionally cause an exception, but don't catch it.
nonexistentFunc();
console.log('This will not run.');

It is possible to monitor 'uncaughtException' events without overriding the default behavior to exit the process by installing a 'uncaughtExceptionMonitor' listener.

Warning: Using 'uncaughtException' correctly#

'uncaughtException' is a crude mechanism for exception handling intended to be used only as a last resort. The event should not be used as an equivalent to On Error Resume Next. Unhandled exceptions inherently mean that an application is in an undefined state. Attempting to resume application code without properly recovering from the exception can cause additional unforeseen and unpredictable issues.

Exceptions thrown from within the event handler will not be caught. Instead the process will exit with a non-zero exit code and the stack trace will be printed. This is to avoid infinite recursion.

Attempting to resume normally after an uncaught exception can be similar to pulling out the power cord when upgrading a computer. Nine out of ten times, nothing happens. But the tenth time, the system becomes corrupted.

The correct use of 'uncaughtException' is to perform synchronous cleanup of allocated resources (e.g. file descriptors, handles, etc) before shutting down the process. It is not safe to resume normal operation after 'uncaughtException'.

To restart a crashed application in a more reliable way, whether 'uncaughtException' is emitted or not, an external monitor should be employed in a separate process to detect application failures and recover or restart as needed.

Event: 'uncaughtExceptionMonitor'#

  • err <Error> The uncaught exception.
  • origin <string> Indicates if the exception originates from an unhandled rejection or from synchronous errors. Can either be 'uncaughtException' or 'unhandledRejection'. The latter is used when an exception happens in a Promise based async context (or if a Promise is rejected) and --unhandled-rejections flag set to strict or throw (which is the default) and the rejection is not handled, or when a rejection happens during the command line entry point's ES module static loading phase.

The 'uncaughtExceptionMonitor' event is emitted before an 'uncaughtException' event is emitted or a hook installed via process.setUncaughtExceptionCaptureCallback() is called.

Installing an 'uncaughtExceptionMonitor' listener does not change the behavior once an 'uncaughtException' event is emitted. The process will still crash if no 'uncaughtException' listener is installed.

import process from 'node:process';

process.on('uncaughtExceptionMonitor', (err, origin) => {
  MyMonitoringTool.logSync(err, origin);
});

// Intentionally cause an exception, but don't catch it.
nonexistentFunc();
// Still crashes Node.jsconst process = require('node:process');

process.on('uncaughtExceptionMonitor', (err, origin) => {
  MyMonitoringTool.logSync(err, origin);
});

// Intentionally cause an exception, but don't catch it.
nonexistentFunc();
// Still crashes Node.js

Event: 'unhandledRejection'#

  • reason <Error> | <any> The object with which the promise was rejected (typically an Error object).
  • promise <Promise> The rejected promise.

The 'unhandledRejection' event is emitted whenever a Promise is rejected and no error handler is attached to the promise within a turn of the event loop. When programming with Promises, exceptions are encapsulated as "rejected promises". Rejections can be caught and handled using promise.catch() and are propagated through a Promise chain. The 'unhandledRejection' event is useful for detecting and keeping track of promises that were rejected whose rejections have not yet been handled.

import process from 'node:process';

process.on('unhandledRejection', (reason, promise) => {
  console.log('Unhandled Rejection at:', promise, '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()`const process = require('node:process');

process.on('unhandledRejection', (reason, promise) => {
  console.log('Unhandled Rejection at:', promise, '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()`

The following will also trigger the 'unhandledRejection' event to be emitted

import process from 'node:process';

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 turnconst process = require('node:process');

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

In this example case, it is possible to track the rejection as a developer error as would typically be the case for other 'unhandledRejection' events. To address such failures, a non-operational .catch(() => { }) handler may be attached to resource.loaded, which would prevent the 'unhandledRejection' event from being emitted.

Event: 'warning'#

  • warning <Error> Key properties of the warning are
    • name <string> The name of the warning. Default: 'Warning'.
    • message <string> A system-provided description of the warning.
    • stack <string> A stack trace to the location in the code where the warning was issued.

The 'warning' event is emitted whenever Node.js emits a process warning.

A process warning is similar to an error in that it describes exceptional conditions that are being brought to the user's attention. However, warnings are not part of the normal Node.js and JavaScript error handling flow. Node.js can emit warnings whenever it detects bad coding practices that could lead to sub-optimal application performance, bugs, or security vulnerabilities.

import process from 'node:process';

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
});const process = require('node:process');

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` オブジェクトによって引き続き発行されます。現在、非推奨警告以外の特定の警告の種類を抑制することはできません。非推奨警告を抑制するには、`--no-deprecation` フラグを参照してください。

次の例は、イベントにリスナーが多すぎる場合に `stderr` に出力される警告を示しています。

$ node
> events.defaultMaxListeners = 1;
> process.on('foo', () => {});
> process.on('foo', () => {});
> (node:38638) MaxListenersExceededWarning: Possible EventEmitter memory leak
detected. 2 foo listeners added. Use emitter.setMaxListeners() to increase limit 

これに対し、次の例ではデフォルトの警告出力をオフにし、`'warning'` イベントにカスタムハンドラーを追加します。

$ node --no-warnings
> const 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` コマンドラインオプションを使用すると、警告のデフォルトのコンソール出力に警告の完全なスタックトレースを含めることができます。

`--throw-deprecation` コマンドラインフラグを使用して Node.js を起動すると、カスタム非推奨警告が例外としてスローされます。

`--trace-deprecation` コマンドラインフラグを使用すると、カスタム非推奨警告がスタックトレースと共に `stderr` に出力されます。

`--no-deprecation` コマンドラインフラグを使用すると、カスタム非推奨警告のすべての報告が抑制されます。

`*-deprecation` コマンドラインフラグは、`'DeprecationWarning'` という名前を使用する警告のみに影響します。

カスタム警告の発行#

カスタム警告またはアプリケーション固有の警告を発行するには、`process.emitWarning()` メソッドを参照してください。

Node.js 警告名#

Node.js によって発行される警告の種類(`name` プロパティで識別)には、厳格なガイドラインはありません。新しい種類の警告はいつでも追加される可能性があります。最も一般的な警告の種類をいくつか示します。

  • `'DeprecationWarning'` - 非推奨の Node.js API または機能の使用を示します。このような警告には、非推奨コードを識別する `'code'` プロパティを含める必要があります。
  • `'ExperimentalWarning'` - Node.js の実験的な API または機能の使用を示します。このような機能は、いつでも変更される可能性があり、サポートされている機能と同じ厳格なセマンティックバージョニングと長期サポートポリシーの対象ではないため、注意して使用する必要があります。
  • `'MaxListenersExceededWarning'` - 特定のイベントに対するリスナーが `EventEmitter` または `EventTarget` のいずれかに登録されすぎていることを示します。これは多くの場合、メモリリークを示しています。
  • `'TimeoutOverflowWarning'` - 32 ビット符号付き整数に収まらない数値が `setTimeout()` 関数または `setInterval()` 関数のいずれかに提供されたことを示します。
  • `'UnsupportedWarning'` - サポートされていないオプションまたは機能の使用を示します。これはエラーとして扱われるのではなく、無視されます。1 つの例として、HTTP/2 互換性 API を使用する場合の HTTP レスポンスステータスメッセージの使用があります。

イベント: `'worker'`#

`'worker'` イベントは、新しい<Worker> スレッドが作成された後に発行されます。

シグナルイベント#

Node.js プロセスがシグナルを受信すると、シグナルイベントが発行されます。標準的な POSIX シグナル名(`'SIGINT'`、`'SIGHUP'` など)のリストについては、`signal(7)` を参照してください。

シグナルは、`Worker` スレッドでは使用できません。

シグナルハンドラーは、シグナル名(`'SIGINT'`、`'SIGTERM'` など)を最初の引数として受け取ります。

各イベントの名前は、シグナルの大文字の一般的な名前になります(例:`SIGINT` シグナルの場合は `'SIGINT'`)。

import process from 'node:process';

// 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.');
});

// Using a single function to handle multiple signals
function handle(signal) {
  console.log(`Received ${signal}`);
}

process.on('SIGINT', handle);
process.on('SIGTERM', handle);const process = require('node:process');

// 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.');
});

// Using a single function to handle multiple signals
function handle(signal) {
  console.log(`Received ${signal}`);
}

process.on('SIGINT', handle);
process.on('SIGTERM', handle);
  • `'SIGUSR1'` は、デバッガーを起動するために Node.js によって予約されています。リスナーをインストールすることは可能ですが、そうするとデバッガーの動作に干渉する可能性があります。
  • `'SIGTERM'` と `'SIGINT'` は、Windows 以外のプラットフォームでデフォルトのハンドラーがあり、コード `128 + シグナル番号` で終了する前にターミナルモードをリセットします。これらのシグナルのいずれかにリスナーがインストールされている場合、そのデフォルトの動作は削除されます(Node.js はもはや終了しません)。
  • `'SIGPIPE'` はデフォルトで無視されます。リスナーをインストールできます。
  • `'SIGHUP'` は、コンソールウィンドウが閉じられたときに Windows で生成され、他のプラットフォームではさまざまな同様の状況で生成されます。`signal(7)` を参照してください。リスナーをインストールできますが、Node.js は約 10 秒後に Windows によって無条件に終了されます。Windows 以外のプラットフォームでは、`SIGHUP` のデフォルトの動作は Node.js を終了することですが、リスナーがインストールされると、そのデフォルトの動作は削除されます。
  • `'SIGTERM'` は Windows ではサポートされていませんが、リスナーをインストールできます。
  • ターミナルからの `'SIGINT'` はすべてのプラットフォームでサポートされており、通常は Ctrl+C で生成できます(ただし、これは構成可能です)。ターミナルの raw モード が有効になっていて Ctrl+C が使用されている場合は生成されません。
  • `'SIGBREAK'` は、Ctrl+Break が押されたときに Windows で配信されます。Windows 以外のプラットフォームでは、リスナーをインストールできますが、送信または生成する方法はありません。
  • `'SIGWINCH'` は、コンソールがサイズ変更されたときに配信されます。Windows では、これはカーソルが移動されているとき、または raw モードで読み取り可能な tty が使用されている場合にのみ、コンソールへの書き込み時に発生します。
  • `'SIGKILL'` にはリスナーをインストールできません。すべてのプラットフォームで Node.js を無条件に終了します。
  • `'SIGSTOP'` にはリスナーをインストールできません。
  • `'SIGBUS'`、`'SIGFPE'`、`'SIGSEGV'`、`'SIGILL'` は、`kill(2)` を使用して人工的に発生させない場合、プロセスを JS リスナーを呼び出すのが安全ではない状態に残します。そうすると、プロセスが応答しなくなる可能性があります。
  • `0` を送信してプロセスの存在を確認できます。プロセスが存在する場合は影響しませんが、プロセスが存在しない場合はエラーをスローします。

Windows はシグナルをサポートしていないため、シグナルによる終了と同等のものはありませんが、Node.js は `process.kill()``subprocess.kill()` でいくつかのエミュレーションを提供しています。

  • `SIGINT`、`SIGTERM`、`SIGKILL` を送信すると、ターゲットプロセスが無条件に終了し、その後、サブプロセスはプロセスがシグナルによって終了したことを報告します。
  • シグナル `0` を送信すると、プロセスの存在を確認するためのプラットフォームに依存しない方法として使用できます。

`process.abort()`#

`process.abort()` メソッドは、Node.js プロセスをすぐに終了し、コアファイルを生成させます。

この機能は、`Worker` スレッドでは使用できません。

`process.allowedNodeEnvironmentFlags`#

`process.allowedNodeEnvironmentFlags` プロパティは、`NODE_OPTIONS` 環境変数内で許可される特別な読み取り専用の `Set` のフラグです。

`process.allowedNodeEnvironmentFlags` は `Set` を拡張しますが、いくつかの異なるフラグ表現を認識するように `Set.prototype.has` をオーバーライドします。`process.allowedNodeEnvironmentFlags.has()` は、次の場合に `true` を返します。

  • フラグの先頭の単一ダッシュ(`-`)または二重ダッシュ(`--`)を省略できます。例:`--inspect-brk` の場合 `inspect-brk`、`-r` の場合 `r`。
  • V8 に渡されるフラグ(`--v8-options` にリストされている)では、先頭以外のダッシュをアンダースコアに置き換えることができます。またはその逆も可能です。例:`--perf_basic_prof`、`--perf-basic-prof`、`--perf_basic-prof` など。
  • フラグには、1 つ以上の等号(`=`)文字を含めることができます。最初の等号以降のすべての文字は無視されます。例:`--stack-trace-limit=100`。
  • フラグは、`NODE_OPTIONS` 内で許可されている必要があります。

`process.allowedNodeEnvironmentFlags` を反復処理するとき、フラグは一度だけ表示されます。それぞれは 1 つ以上のダッシュで始まります。V8 に渡されるフラグには、先頭以外のダッシュの代わりにアンダースコアが含まれます。

import { allowedNodeEnvironmentFlags } from 'node:process';

allowedNodeEnvironmentFlags.forEach((flag) => {
  // -r
  // --inspect-brk
  // --abort_on_uncaught_exception
  // ...
});const { allowedNodeEnvironmentFlags } = require('node:process');

allowedNodeEnvironmentFlags.forEach((flag) => {
  // -r
  // --inspect-brk
  // --abort_on_uncaught_exception
  // ...
});

`process.allowedNodeEnvironmentFlags` の `add()`、`clear()`、`delete()` メソッドは何も行わず、サイレントに失敗します。

`NODE_OPTIONS` サポートなしで Node.js がコンパイルされた場合(`process.config` に表示)、`process.allowedNodeEnvironmentFlags` には、許可されていたものが含まれます。

`process.arch`#

Node.js バイナリがコンパイルされたオペレーティングシステムの CPU アーキテクチャ。可能な値は、`'arm'`、`'arm64'`、`'ia32'`、`'loong64'`、`'mips'`、`'mipsel'`、`'ppc'`、`'ppc64'`、`'riscv64'`、`'s390'`、`'s390x'`、`'x64'` です。

import { arch } from 'node:process';

console.log(`This processor architecture is ${arch}`);const { arch } = require('node:process');

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

`process.argv`#

`process.argv` プロパティは、Node.js プロセスが起動されたときに渡されたコマンドライン引数を含む配列を返します。最初の要素は `process.execPath` になります。`argv[0]` の元の値にアクセスする必要がある場合は、`process.argv0` を参照してください。2 番目の要素は、実行される JavaScript ファイルへのパスになります。残りの要素は、追加のコマンドライン引数になります。

例えば、process-args.js のスクリプトが以下のようになっているとします。

import { argv } from 'node:process';

// print process.argv
argv.forEach((val, index) => {
  console.log(`${index}: ${val}`);
});const { argv } = require('node:process');

// print process.argv
argv.forEach((val, index) => {
  console.log(`${index}: ${val}`);
});

Node.js プロセスを以下のように起動すると

node process-args.js one two=three four 

以下の出力が生成されます。

0: /usr/local/bin/node
1: /Users/mjr/work/node/process-args.js
2: one
3: two=three
4: four 

process.argv0#

process.argv0 プロパティは、Node.js の起動時に渡された argv[0] の元の値の読み取り専用のコピーを格納します。

$ bash -c 'exec -a customArgv0 ./node'
> process.argv[0]
'/Volumes/code/external/node/out/Release/node'
> process.argv0
'customArgv0' 

process.channel#

Node.js プロセスが IPC チャンネルを使用して生成された場合(子プロセス のドキュメントを参照)、process.channel プロパティは IPC チャンネルへの参照になります。IPC チャンネルが存在しない場合、このプロパティは undefined です。

process.channel.ref()#

このメソッドは、事前に .unref() が呼び出されていた場合でも、プロセスのイベントループを動作させ続けるために IPC チャンネルを使用します。

通常、これは process オブジェクトの 'disconnect''message' リスナーの数によって管理されます。しかし、このメソッドを使用して、特定の動作を明示的に要求できます。

process.channel.unref()#

このメソッドは、IPC チャンネルがプロセスのイベントループを動作させなくなり、チャンネルが開いている間でも終了することを許可します。

通常、これは process オブジェクトの 'disconnect''message' リスナーの数によって管理されます。しかし、このメソッドを使用して、特定の動作を明示的に要求できます。

process.chdir(directory)#

process.chdir() メソッドは、Node.js プロセスの現在の作業ディレクトリを変更するか、変更に失敗した場合(例えば、指定された directory が存在しない場合)、例外をスローします。

import { chdir, cwd } from 'node:process';

console.log(`Starting directory: ${cwd()}`);
try {
  chdir('/tmp');
  console.log(`New directory: ${cwd()}`);
} catch (err) {
  console.error(`chdir: ${err}`);
}const { chdir, cwd } = require('node:process');

console.log(`Starting directory: ${cwd()}`);
try {
  chdir('/tmp');
  console.log(`New directory: ${cwd()}`);
} catch (err) {
  console.error(`chdir: ${err}`);
}

この機能は、`Worker` スレッドでは使用できません。

process.config#

process.config プロパティは、現在の Node.js 実行可能ファイルのコンパイルに使用された構成オプションの JavaScript 表現を含む、凍結された Object を返します。これは、./configure スクリプトを実行したときに生成された config.gypi ファイルと同じです。

出力例は以下のようになります。

{
  target_defaults:
   { cflags: [],
     default_configuration: 'Release',
     defines: [],
     include_dirs: [],
     libraries: [] },
  variables:
   {
     host_arch: 'x64',
     napi_build_version: 5,
     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_openssl: 'true',
     node_shared_openssl: 'false',
     strict_aliasing: 'true',
     target_arch: 'x64',
     v8_use_snapshot: 1
   }
} 

process.connected#

Node.js プロセスが IPC チャンネルを使用して生成された場合(子プロセスクラスタ のドキュメントを参照)、process.connected プロパティは、IPC チャンネルが接続されている限り true を返し、process.disconnect() が呼び出された後は false を返します。

process.connectedfalse になると、process.send() を使用して IPC チャンネルを介してメッセージを送信することはできなくなります。

process.constrainedMemory()#

安定性: 1 - 実験的

OSによって課せられた制限に基づいて、プロセスが使用できるメモリの量(バイト単位)を取得します。そのような制約がない場合、または制約が不明な場合は、undefined が返されます。

詳細については、uv_get_constrained_memory を参照してください。

process.cpuUsage([previousValue])#

process.cpuUsage() メソッドは、現在のプロセスのユーザーとシステムの CPU 使用時間を、usersystem プロパティを持つオブジェクトで返します。これらの値はマイクロ秒単位(100万分の1秒)です。これらの値はそれぞれユーザーコードとシステムコードで費やされた時間を測定し、複数の CPU コアがこのプロセスの作業を実行している場合、実際の経過時間よりも大きくなる可能性があります。

process.cpuUsage() への以前の呼び出しの結果を引数として関数に渡して、差分を読み取ることができます。

import { cpuUsage } from 'node:process';

const startUsage = cpuUsage();
// { user: 38579, system: 6986 }

// spin the CPU for 500 milliseconds
const now = Date.now();
while (Date.now() - now < 500);

console.log(cpuUsage(startUsage));
// { user: 514883, system: 11226 }const { cpuUsage } = require('node:process');

const startUsage = cpuUsage();
// { user: 38579, system: 6986 }

// spin the CPU for 500 milliseconds
const now = Date.now();
while (Date.now() - now < 500);

console.log(cpuUsage(startUsage));
// { user: 514883, system: 11226 }

process.cwd()#

process.cwd() メソッドは、Node.js プロセスの現在の作業ディレクトリを返します。

import { cwd } from 'node:process';

console.log(`Current directory: ${cwd()}`);const { cwd } = require('node:process');

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

process.debugPort#

有効になっている場合の Node.js デバッガーで使用されるポート。

import process from 'node:process';

process.debugPort = 5858;const process = require('node:process');

process.debugPort = 5858;

process.disconnect()#

Node.js プロセスが IPC チャンネルを使用して生成された場合(子プロセスクラスタ のドキュメントを参照)、process.disconnect() メソッドは親プロセスへの IPC チャンネルを閉じ、他の接続によって存続させられていない限り、子プロセスが正常に終了できるようにします。

process.disconnect() を呼び出す効果は、親プロセスから ChildProcess.disconnect() を呼び出すことと同じです。

Node.js プロセスが IPC チャンネルを使用して生成されなかった場合、process.disconnect()undefined になります。

process.dlopen(module, filename[, flags])#

process.dlopen() メソッドを使用すると、共有オブジェクトを動的にロードできます。これは主に require() によって C++ アドオンをロードするために使用され、特別な場合を除いて直接使用しないでください。つまり、カスタム dlopen フラグや ES モジュールからのロードなどの特別な理由がない限り、require() の方が process.dlopen() よりも優先されます。

flags 引数は、dlopen の動作を指定するために使用する整数です。詳細については、os.constants.dlopen のドキュメントを参照してください。

process.dlopen() を呼び出す際の重要な要件は、module インスタンスを渡す必要があることです。C++ アドオンによってエクスポートされた関数は、その後 module.exports を介してアクセスできます。

以下の例は、foo 関数をエクスポートする local.node という名前の C++ アドオンをロードする方法を示しています。RTLD_NOW 定数を渡すことで、すべてのシンボルが呼び出しが戻る前にロードされます。この例では、定数は使用可能であると仮定しています。

import { dlopen } from 'node:process';
import { constants } from 'node:os';
import { fileURLToPath } from 'node:url';

const module = { exports: {} };
dlopen(module, fileURLToPath(new URL('local.node', import.meta.url)),
       constants.dlopen.RTLD_NOW);
module.exports.foo();const { dlopen } = require('node:process');
const { constants } = require('node:os');
const { join } = require('node:path');

const module = { exports: {} };
dlopen(module, join(__dirname, 'local.node'), constants.dlopen.RTLD_NOW);
module.exports.foo();

process.emitWarning(warning[, options])#

  • warning <string> | <Error> 発行する警告。
  • options <Object>
    • type <string> warningString の場合、type は発行される警告の種類に使用される名前です。デフォルト: 'Warning'
    • code <string> 発行される警告インスタンスの一意の識別子。
    • ctor <Function> warningString の場合、ctor は生成されたスタックトレースを制限するために使用されるオプションの関数です。デフォルト: process.emitWarning
    • detail <string> エラーに含める追加のテキスト。

process.emitWarning() メソッドは、カスタムまたはアプリケーション固有のプロセス警告を発行するために使用できます。'warning' イベントにハンドラーを追加することで、これらをリッスンできます。

import { emitWarning } from 'node:process';

// Emit a warning with a code and additional detail.
emitWarning('Something happened!', {
  code: 'MY_WARNING',
  detail: 'This is some additional information',
});
// Emits:
// (node:56338) [MY_WARNING] Warning: Something happened!
// This is some additional informationconst { emitWarning } = require('node:process');

// Emit a warning with a code and additional detail.
emitWarning('Something happened!', {
  code: 'MY_WARNING',
  detail: 'This is some additional information',
});
// Emits:
// (node:56338) [MY_WARNING] Warning: Something happened!
// This is some additional information

この例では、process.emitWarning() によって内部的に Error オブジェクトが生成され、'warning' ハンドラーに渡されます。

import process from 'node:process';

process.on('warning', (warning) => {
  console.warn(warning.name);    // 'Warning'
  console.warn(warning.message); // 'Something happened!'
  console.warn(warning.code);    // 'MY_WARNING'
  console.warn(warning.stack);   // Stack trace
  console.warn(warning.detail);  // 'This is some additional information'
});const process = require('node:process');

process.on('warning', (warning) => {
  console.warn(warning.name);    // 'Warning'
  console.warn(warning.message); // 'Something happened!'
  console.warn(warning.code);    // 'MY_WARNING'
  console.warn(warning.stack);   // Stack trace
  console.warn(warning.detail);  // 'This is some additional information'
});

warningError オブジェクトとして渡された場合、options 引数は無視されます。

process.emitWarning(warning[, type[, code]][, ctor])#

  • warning <string> | <Error> 発行する警告。
  • type <string> warningString の場合、type は発行される警告の種類に使用される名前です。デフォルト: 'Warning'
  • code <string> 発行される警告インスタンスの一意の識別子。
  • ctor <Function> warningString の場合、ctor は生成されたスタックトレースを制限するために使用されるオプションの関数です。デフォルト: process.emitWarning

process.emitWarning() メソッドは、カスタムまたはアプリケーション固有のプロセス警告を発行するために使用できます。'warning' イベントにハンドラーを追加することで、これらをリッスンできます。

import { emitWarning } from 'node:process';

// Emit a warning using a string.
emitWarning('Something happened!');
// Emits: (node: 56338) Warning: Something happened!const { emitWarning } = require('node:process');

// Emit a warning using a string.
emitWarning('Something happened!');
// Emits: (node: 56338) Warning: Something happened!
import { emitWarning } from 'node:process';

// Emit a warning using a string and a type.
emitWarning('Something Happened!', 'CustomWarning');
// Emits: (node:56338) CustomWarning: Something Happened!const { emitWarning } = require('node:process');

// Emit a warning using a string and a type.
emitWarning('Something Happened!', 'CustomWarning');
// Emits: (node:56338) CustomWarning: Something Happened!
import { emitWarning } from 'node:process';

emitWarning('Something happened!', 'CustomWarning', 'WARN001');
// Emits: (node:56338) [WARN001] CustomWarning: Something happened!const { emitWarning } = require('node:process');

process.emitWarning('Something happened!', 'CustomWarning', 'WARN001');
// Emits: (node:56338) [WARN001] CustomWarning: Something happened!

前の各例では、process.emitWarning() によって内部的に Error オブジェクトが生成され、'warning' ハンドラーに渡されます。

import process from 'node:process';

process.on('warning', (warning) => {
  console.warn(warning.name);
  console.warn(warning.message);
  console.warn(warning.code);
  console.warn(warning.stack);
});const process = require('node:process');

process.on('warning', (warning) => {
  console.warn(warning.name);
  console.warn(warning.message);
  console.warn(warning.code);
  console.warn(warning.stack);
});

warningError オブジェクトとして渡された場合、変更されずに 'warning' イベントハンドラーに渡されます(オプションの typecodector 引数は無視されます)。

import { emitWarning } from 'node:process';

// Emit a warning using an Error object.
const myWarning = new Error('Something happened!');
// Use the Error name property to specify the type name
myWarning.name = 'CustomWarning';
myWarning.code = 'WARN001';

emitWarning(myWarning);
// Emits: (node:56338) [WARN001] CustomWarning: Something happened!const { emitWarning } = require('node:process');

// Emit a warning using an Error object.
const myWarning = new Error('Something happened!');
// Use the Error name property to specify the type name
myWarning.name = 'CustomWarning';
myWarning.code = 'WARN001';

emitWarning(myWarning);
// Emits: (node:56338) [WARN001] CustomWarning: Something happened!

warning が文字列または Error オブジェクト以外の場合は、TypeError がスローされます。

プロセス警告は Error オブジェクトを使用しますが、プロセス警告メカニズムは、通常のエラー処理メカニズムの代替ではありません。

警告の type'DeprecationWarning' の場合、以下の追加処理が実行されます。

  • --throw-deprecation コマンドラインフラグを使用すると、非推奨警告はイベントとして発行されるのではなく、例外としてスローされます。
  • --no-deprecation コマンドラインフラグを使用すると、非推奨警告は抑制されます。
  • --trace-deprecation コマンドラインフラグを使用すると、非推奨警告は完全なスタックトレースと共に stderr に出力されます。

重複する警告の回避#

ベストプラクティスとして、警告はプロセスごとに一度だけ発行する必要があります。そのためには、emitWarning() をブール値の後ろに配置します。

import { emitWarning } from 'node:process';

function emitMyWarning() {
  if (!emitMyWarning.warned) {
    emitMyWarning.warned = true;
    emitWarning('Only warn once!');
  }
}
emitMyWarning();
// Emits: (node: 56339) Warning: Only warn once!
emitMyWarning();
// Emits nothingconst { emitWarning } = require('node:process');

function emitMyWarning() {
  if (!emitMyWarning.warned) {
    emitMyWarning.warned = true;
    emitWarning('Only warn once!');
  }
}
emitMyWarning();
// Emits: (node: 56339) Warning: Only warn once!
emitMyWarning();
// Emits nothing

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プロセス外、または(明示的に要求されない限り)他のWorker スレッドには反映されません。つまり、次の例は機能しません。

node -e 'process.env.foo = "bar"' && echo $foo 

一方、以下は機能します。

import { env } from 'node:process';

env.foo = 'bar';
console.log(env.foo);const { env } = require('node:process');

env.foo = 'bar';
console.log(env.foo);

process.env にプロパティを代入すると、値は暗黙的に文字列に変換されます。**この動作は非推奨です。**将来のバージョンのNode.jsでは、値が文字列、数値、またはブール値でない場合にエラーがスローされる可能性があります。

import { env } from 'node:process';

env.test = null;
console.log(env.test);
// => 'null'
env.test = undefined;
console.log(env.test);
// => 'undefined'const { env } = require('node:process');

env.test = null;
console.log(env.test);
// => 'null'
env.test = undefined;
console.log(env.test);
// => 'undefined'

process.env からプロパティを削除するには、delete を使用します。

import { env } from 'node:process';

env.TEST = 1;
delete env.TEST;
console.log(env.TEST);
// => undefinedconst { env } = require('node:process');

env.TEST = 1;
delete env.TEST;
console.log(env.TEST);
// => undefined

Windowsオペレーティングシステムでは、環境変数は大文字と小文字が区別されません。

import { env } from 'node:process';

env.TEST = 1;
console.log(env.test);
// => 1const { env } = require('node:process');

env.TEST = 1;
console.log(env.test);
// => 1

Worker インスタンスの作成時に明示的に指定しない限り、各Worker スレッドには、親スレッドのprocess.envに基づいた、またはWorker コンストラクタのenvオプションとして指定されたprocess.envの独自の複製があります。process.env の変更はWorker スレッド間では表示されず、メインスレッドだけがオペレーティングシステムまたはネイティブアドオンに表示される変更を行うことができます。Windowsでは、Worker インスタンス上のprocess.envのコピーは、メインスレッドとは異なり、大文字と小文字が区別されます。

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'] 

Worker コンストラクタ を参照して、このプロパティを持つワーカースレッドの詳細な動作を確認してください。

process.execPath#

process.execPath プロパティは、Node.jsプロセスを開始した実行可能ファイルの絶対パス名を返します。シンボリックリンクがある場合は、解決されます。

'/usr/local/bin/node' 

process.exit([code])#

process.exit() メソッドは、code の終了ステータスでプロセスを同期的に終了するようにNode.jsに指示します。code が省略された場合、終了ステータスは「成功」コード0、またはprocess.exitCodeが設定されている場合はその値を使用します。すべての'exit' イベントリスナーが呼び出されるまで、Node.jsは終了しません。

「失敗」コードで終了するには

import { exit } from 'node:process';

exit(1);const { exit } = require('node:process');

exit(1);

Node.jsを実行したシェルは、終了コードを1として認識するはずです。

process.exit() を呼び出すと、未完了の非同期操作(process.stdoutprocess.stderr へのI/O操作を含む)が残っていても、プロセスはできるだけ早く強制終了されます。

ほとんどの場合、process.exit() を明示的に呼び出す必要はありません。イベントループに保留中の作業がない場合、Node.jsプロセスは自動的に終了します。プロセスが正常に終了する際に使用する終了コードを指定するには、process.exitCode プロパティを設定します。

たとえば、次の例は、process.exit() メソッドの誤用を示しており、stdoutに出力されるデータが切り捨てられて失われる可能性があります。

import { exit } from 'node:process';

// This is an example of what *not* to do:
if (someConditionNotMet()) {
  printUsageToStdout();
  exit(1);
}const { exit } = require('node:process');

// This is an example of what *not* to do:
if (someConditionNotMet()) {
  printUsageToStdout();
  exit(1);
}

これが問題となる理由は、Node.jsでのprocess.stdoutへの書き込みが非同期であることがあり、Node.jsイベントループの複数のティックにわたって発生する可能性があるためです。しかし、process.exit()を呼び出すと、それらの追加のstdoutへの書き込みが実行される前にプロセスが強制終了されます。

process.exit() を直接呼び出すのではなく、process.exitCode を設定し、イベントループに追加の作業をスケジュールしないことで、プロセスが自然に終了できるようにする必要があります。

import process from 'node:process';

// How to properly set the exit code while letting
// the process exit gracefully.
if (someConditionNotMet()) {
  printUsageToStdout();
  process.exitCode = 1;
}const process = require('node:process');

// How to properly set the exit code while letting
// the process exit gracefully.
if (someConditionNotMet()) {
  printUsageToStdout();
  process.exitCode = 1;
}

エラー状態のためにNode.jsプロセスを終了する必要がある場合は、キャッチされないエラーをスローし、プロセスがそれに応じて終了できるようにすることが、process.exit()を呼び出すよりも安全です。

Worker スレッドでは、この関数は現在のプロセスではなく、現在のスレッドを停止します。

process.exitCode#

  • <整数> | <文字列> | <null> | <undefined> 終了コード。文字列型の場合、整数文字列(例:'1')のみが許可されます。**デフォルト:** undefined

プロセスが正常に終了するか、コードを指定せずにprocess.exit() を介して終了した場合のプロセス終了コードとなる数値。

process.exit(code) にコードを指定すると、それ以前のprocess.exitCodeの設定は上書きされます。

process.getActiveResourcesInfo()#

安定性: 1 - 実験的

process.getActiveResourcesInfo() メソッドは、現在イベントループをアクティブに維持しているアクティブなリソースの種類を含む文字列の配列を返します。

import { getActiveResourcesInfo } from 'node:process';
import { setTimeout } from 'node:timers';

console.log('Before:', getActiveResourcesInfo());
setTimeout(() => {}, 1000);
console.log('After:', getActiveResourcesInfo());
// Prints:
//   Before: [ 'CloseReq', 'TTYWrap', 'TTYWrap', 'TTYWrap' ]
//   After: [ 'CloseReq', 'TTYWrap', 'TTYWrap', 'TTYWrap', 'Timeout' ]const { getActiveResourcesInfo } = require('node:process');
const { setTimeout } = require('node:timers');

console.log('Before:', getActiveResourcesInfo());
setTimeout(() => {}, 1000);
console.log('After:', getActiveResourcesInfo());
// Prints:
//   Before: [ 'TTYWrap', 'TTYWrap', 'TTYWrap' ]
//   After: [ 'TTYWrap', 'TTYWrap', 'TTYWrap', 'Timeout' ]

process.getegid()#

process.getegid() メソッドは、Node.jsプロセスの有効なグループ ID の数値を返します。(getegid(2)を参照してください。)

import process from 'node:process';

if (process.getegid) {
  console.log(`Current gid: ${process.getegid()}`);
}const process = require('node:process');

if (process.getegid) {
  console.log(`Current gid: ${process.getegid()}`);
}

この関数は、POSIXプラットフォーム(つまり、WindowsまたはAndroidではない)でのみ使用できます。

process.geteuid()#

process.geteuid() メソッドは、プロセスの有効なユーザー ID の数値を返します。(geteuid(2)を参照してください。)

import process from 'node:process';

if (process.geteuid) {
  console.log(`Current uid: ${process.geteuid()}`);
}const process = require('node:process');

if (process.geteuid) {
  console.log(`Current uid: ${process.geteuid()}`);
}

この関数は、POSIXプラットフォーム(つまり、WindowsまたはAndroidではない)でのみ使用できます。

process.getgid()#

process.getgid() メソッドは、プロセスのグループ ID の数値を返します。(getgid(2)を参照してください。)

import process from 'node:process';

if (process.getgid) {
  console.log(`Current gid: ${process.getgid()}`);
}const process = require('node:process');

if (process.getgid) {
  console.log(`Current gid: ${process.getgid()}`);
}

この関数は、POSIXプラットフォーム(つまり、WindowsまたはAndroidではない)でのみ使用できます。

process.getgroups()#

process.getgroups() メソッドは、補足グループ ID を含む配列を返します。POSIXでは、有効なグループIDが含まれるかどうかは指定されていませんが、Node.jsでは常に含まれるように保証されています。

import process from 'node:process';

if (process.getgroups) {
  console.log(process.getgroups()); // [ 16, 21, 297 ]
}const process = require('node:process');

if (process.getgroups) {
  console.log(process.getgroups()); // [ 16, 21, 297 ]
}

この関数は、POSIXプラットフォーム(つまり、WindowsまたはAndroidではない)でのみ使用できます。

process.getuid()#

process.getuid() メソッドは、プロセスの数値ユーザーIDを返します。(getuid(2)を参照してください。)

import process from 'node:process';

if (process.getuid) {
  console.log(`Current uid: ${process.getuid()}`);
}const process = require('node:process');

if (process.getuid) {
  console.log(`Current uid: ${process.getuid()}`);
}

この関数は、POSIXプラットフォーム(つまり、WindowsまたはAndroidではない)でのみ使用できます。

process.hasUncaughtExceptionCaptureCallback()#

process.setUncaughtExceptionCaptureCallback() を使用してコールバックが設定されているかどうかを示します。

process.hrtime([time])#

安定性: 3 - レガシー。代わりに process.hrtime.bigint() を使用してください。

これは、JavaScriptに `bigint` が導入される前のprocess.hrtime.bigint() のレガシーバージョンです。

process.hrtime() メソッドは、[秒、ナノ秒]タプルArrayで現在の高解像度リアルタイムを返します。ここで、ナノ秒は、秒の精度で表現できないリアルタイムの残りの部分です。

time はオプションのパラメータであり、現在の時刻との差を計算するために、以前のprocess.hrtime()呼び出しの結果でなければなりません。渡されたパラメータがタプルArrayでない場合、TypeErrorがスローされます。以前のprocess.hrtime()呼び出しの結果ではなく、ユーザー定義の配列を渡すと、動作が未定義になります。

これらの時間は過去の任意の時点からの相対時間であり、時刻とは関係なく、したがってクロックドリフトの影響を受けません。主な用途は、間隔間の性能測定です。

import { hrtime } from 'node:process';

const NS_PER_SEC = 1e9;
const time = hrtime();
// [ 1800216, 25 ]

setTimeout(() => {
  const diff = hrtime(time);
  // [ 1, 552 ]

  console.log(`Benchmark took ${diff[0] * NS_PER_SEC + diff[1]} nanoseconds`);
  // Benchmark took 1000000552 nanoseconds
}, 1000);const { hrtime } = require('node:process');

const NS_PER_SEC = 1e9;
const time = hrtime();
// [ 1800216, 25 ]

setTimeout(() => {
  const diff = hrtime(time);
  // [ 1, 552 ]

  console.log(`Benchmark took ${diff[0] * NS_PER_SEC + diff[1]} nanoseconds`);
  // Benchmark took 1000000552 nanoseconds
}, 1000);

process.hrtime.bigint()#

ナノ秒単位の現在の高解像度リアルタイムをbigintとして返すprocess.hrtime()メソッドのbigintバージョン。

process.hrtime()とは異なり、2つのbigintの減算によって直接差を計算できるため、追加のtime引数はサポートされていません。

import { hrtime } from 'node:process';

const start = hrtime.bigint();
// 191051479007711n

setTimeout(() => {
  const end = hrtime.bigint();
  // 191052633396993n

  console.log(`Benchmark took ${end - start} nanoseconds`);
  // Benchmark took 1154389282 nanoseconds
}, 1000);const { hrtime } = require('node:process');

const start = hrtime.bigint();
// 191051479007711n

setTimeout(() => {
  const end = hrtime.bigint();
  // 191052633396993n

  console.log(`Benchmark took ${end - start} nanoseconds`);
  // Benchmark took 1154389282 nanoseconds
}, 1000);

process.initgroups(user, extraGroup)#

process.initgroups()メソッドは/etc/groupファイルを読み取り、ユーザーがメンバーであるすべてのグループを使用してグループアクセスリストを初期化します。これは、Node.jsプロセスがrootアクセス権またはCAP_SETGID機能を持っている必要がある特権操作です。

権限の降格には注意してください

import { getgroups, initgroups, setgid } from 'node:process';

console.log(getgroups());         // [ 0 ]
initgroups('nodeuser', 1000);     // switch user
console.log(getgroups());         // [ 27, 30, 46, 1000, 0 ]
setgid(1000);                     // drop root gid
console.log(getgroups());         // [ 27, 30, 46, 1000 ]const { getgroups, initgroups, setgid } = require('node:process');

console.log(getgroups());         // [ 0 ]
initgroups('nodeuser', 1000);     // switch user
console.log(getgroups());         // [ 27, 30, 46, 1000, 0 ]
setgid(1000);                     // drop root gid
console.log(getgroups());         // [ 27, 30, 46, 1000 ]

この関数はPOSIXプラットフォームでのみ使用可能です(つまり、WindowsやAndroidでは使用できません)。この機能は、Workerスレッドでは使用できません。

process.kill(pid[, signal])#

  • pid <number> プロセスID
  • signal <string> | <number> 送信するシグナル(文字列または数値)。デフォルト: 'SIGTERM'

process.kill()メソッドは、pidで識別されるプロセスにsignalを送信します。

シグナル名は、'SIGINT''SIGHUP'などの文字列です。シグナルイベントkill(2)を参照して詳細を確認してください。

ターゲットpidが存在しない場合、このメソッドはエラーをスローします。特別なケースとして、プロセスが存在するかを確認するためにシグナル0を使用できます。Windowsプラットフォームでは、pidがプロセスグループをキルするために使用された場合、エラーをスローします。

この関数の名前はprocess.kill()ですが、実際にはkillシステムコールのようなシグナル送信プログラムです。送信されたシグナルは、ターゲットプロセスをキルする以外の動作をする可能性があります。

import process, { kill } from 'node:process';

process.on('SIGHUP', () => {
  console.log('Got SIGHUP signal.');
});

setTimeout(() => {
  console.log('Exiting.');
  process.exit(0);
}, 100);

kill(process.pid, 'SIGHUP');const process = require('node:process');

process.on('SIGHUP', () => {
  console.log('Got SIGHUP signal.');
});

setTimeout(() => {
  console.log('Exiting.');
  process.exit(0);
}, 100);

process.kill(process.pid, 'SIGHUP');

Node.jsプロセスがSIGUSR1を受信すると、Node.jsはデバッガーを開始します。シグナルイベントを参照してください。

process.loadEnvFile(path)#

安定性: 1.1 - アクティブな開発中

.envファイルをprocess.envにロードします。.envファイル内のNODE_OPTIONSの使用は、Node.jsには影響しません。

const { loadEnvFile } = require('node:process');
loadEnvFile();import { loadEnvFile } from 'node:process';
loadEnvFile();

process.mainModule#

安定性: 0 - 非推奨: require.mainを使用してください。

process.mainModuleプロパティは、require.mainを取得する別の方法を提供します。違いは、メインモジュールが実行時に変更された場合、require.mainは変更前に要求されたモジュールでは元のメインモジュールを参照している可能性があることです。一般的に、両方が同じモジュールを参照していると仮定しても安全です。

require.mainと同様に、エントリスクリプトがない場合、process.mainModuleundefinedになります。

process.memoryUsage()#

Node.jsプロセスのメモリ使用量をバイト単位で記述したオブジェクトを返します。

import { memoryUsage } from 'node:process';

console.log(memoryUsage());
// Prints:
// {
//  rss: 4935680,
//  heapTotal: 1826816,
//  heapUsed: 650472,
//  external: 49879,
//  arrayBuffers: 9386
// }const { memoryUsage } = require('node:process');

console.log(memoryUsage());
// Prints:
// {
//  rss: 4935680,
//  heapTotal: 1826816,
//  heapUsed: 650472,
//  external: 49879,
//  arrayBuffers: 9386
// }
  • heapTotalheapUsedは、V8のメモリ使用量を参照します。
  • externalは、V8によって管理されるJavaScriptオブジェクトにバインドされたC++オブジェクトのメモリ使用量を参照します。
  • rss(常駐セットサイズ)は、すべてのC++およびJavaScriptオブジェクトとコードを含む、プロセスがメインメモリデバイスで占有するスペースの量です(割り当てられた総メモリのサブセット)。
  • arrayBuffersは、すべてのNode.js Bufferを含む、ArrayBufferおよびSharedArrayBufferに割り当てられたメモリを参照します。これはexternal値にも含まれています。Node.jsが組み込みライブラリとして使用される場合、ArrayBufferの割り当てが追跡されないため、この値は0になる可能性があります。

Workerスレッドを使用する場合、rssはプロセス全体で有効な値になり、他のフィールドは現在のスレッドのみを参照します。

process.memoryUsage()メソッドは、メモリ使用量に関する情報を収集するために各ページを反復処理するため、プログラムのメモリ割り当てによっては遅くなる可能性があります。

process.memoryUsage.rss()#

process.memoryUsage.rss()メソッドは、バイト単位の常駐セットサイズ(RSS)を表す整数を返します。

常駐セットサイズとは、すべてのC++およびJavaScriptオブジェクトとコードを含む、プロセスがメインメモリデバイスで占有するスペースの量です(割り当てられた総メモリのサブセット)。

これはprocess.memoryUsage()によって提供されるrssプロパティと同じ値ですが、process.memoryUsage.rss()の方が高速です。

import { memoryUsage } from 'node:process';

console.log(memoryUsage.rss());
// 35655680const { memoryUsage } = require('node:process');

console.log(memoryUsage.rss());
// 35655680

process.nextTick(callback[, ...args])#

  • callback <Function>
  • ...args <any> callbackを呼び出すときに渡す追加引数

process.nextTick()は、"次のティックキュー"にcallbackを追加します。このキューは、JavaScriptスタックでの現在の操作が完了した後で、イベントループが継続する前に完全に排出されます。process.nextTick()を再帰的に呼び出すと、無限ループを作成する可能性があります。イベントループガイドで詳細を確認してください。

import { nextTick } from 'node:process';

console.log('start');
nextTick(() => {
  console.log('nextTick callback');
});
console.log('scheduled');
// Output:
// start
// scheduled
// nextTick callbackconst { nextTick } = require('node:process');

console.log('start');
nextTick(() => {
  console.log('nextTick callback');
});
console.log('scheduled');
// Output:
// start
// scheduled
// nextTick callback

これは、オブジェクトが構築された後、I/Oが発生する前に、ユーザーがイベントハンドラーを割り当てる機会を与えるために、APIを開発する場合に重要です。

import { nextTick } from 'node:process';

function MyThing(options) {
  this.setupOptions(options);

  nextTick(() => {
    this.startDoingStuff();
  });
}

const thing = new MyThing();
thing.getReadyForStuff();

// thing.startDoingStuff() gets called now, not before.const { nextTick } = require('node:process');

function MyThing(options) {
  this.setupOptions(options);

  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()のどちらが先に呼び出されるかは明確ではありません。

次のアプローチの方がはるかに優れています。

import { nextTick } from 'node:process';

function definitelyAsync(arg, cb) {
  if (arg) {
    nextTick(cb);
    return;
  }

  fs.stat('file', cb);
}const { nextTick } = require('node:process');

function definitelyAsync(arg, cb) {
  if (arg) {
    nextTick(cb);
    return;
  }

  fs.stat('file', cb);
}

queueMicrotask()process.nextTick()の使い分け#

queueMicrotask() APIは、解決済みのPromiseのthen、catch、finallyハンドラーを実行するために使用されるのと同じマイクロタスクキューを使用して関数の実行を遅延させるための、process.nextTick()の代替手段です。Node.jsでは、"次のティックキュー"が排出されるたびに、その直後にマイクロタスクキューが排出されます。

import { nextTick } from 'node:process';

Promise.resolve().then(() => console.log(2));
queueMicrotask(() => console.log(3));
nextTick(() => console.log(1));
// Output:
// 1
// 2
// 3const { nextTick } = require('node:process');

Promise.resolve().then(() => console.log(2));
queueMicrotask(() => console.log(3));
nextTick(() => console.log(1));
// Output:
// 1
// 2
// 3

ほとんどのユーザーランドのユースケースでは、queueMicrotask() APIは、複数のJavaScriptプラットフォーム環境で動作する、移植可能で信頼性の高い実行遅延メカニズムを提供し、process.nextTick()よりも優先されるべきです。単純なシナリオでは、queueMicrotask()process.nextTick()の直接的な置き換えとして使用できます。

console.log('start');
queueMicrotask(() => {
  console.log('microtask callback');
});
console.log('scheduled');
// Output:
// start
// scheduled
// microtask callback 

2つのAPI間の注目すべき違いの1つは、process.nextTick()では、遅延関数に引数として渡される追加の値を指定できることです。queueMicrotask()で同じ結果を得るには、クロージャまたはバインドされた関数を使用する必要があります。

function deferred(a, b) {
  console.log('microtask', a + b);
}

console.log('start');
queueMicrotask(deferred.bind(undefined, 1, 2));
console.log('scheduled');
// Output:
// start
// scheduled
// microtask 3 

次のティックキューとマイクロタスクキュー内で発生したエラーの処理方法には、わずかな違いがあります。キューに入れられたマイクロタスクコールバック内でスローされたエラーは、可能な限りキューに入れられたコールバック内で処理する必要があります。そうでない場合、process.on('uncaughtException')イベントハンドラーを使用して、エラーを捕捉して処理できます。

そうでない限り、process.nextTick()の特定の機能が必要でない限り、queueMicrotask()を使用してください。

process.noDeprecation#

process.noDeprecationプロパティは、現在のNode.jsプロセスで--no-deprecationフラグが設定されているかどうかを示します。'warning'イベントemitWarning()メソッドのドキュメントを参照して、このフラグの動作の詳細を確認してください。

process.permission#

このAPIは、--experimental-permissionフラグを介して使用できます。

process.permissionは、現在のプロセスの権限を管理するために使用されるメソッドを持つオブジェクトです。追加のドキュメントは権限モデルにあります。

process.permission.has(scope[, reference])#

プロセスが指定されたスコープと参照にアクセスできることを確認します。参照が提供されない場合、グローバルスコープが想定されます。たとえば、process.permission.has('fs.read')は、プロセスにすべてのファイルシステム読み取り権限があるかどうかを確認します。

参照は、指定されたスコープに基づいて意味を持ちます。例えば、スコープがファイルシステムの場合、参照はファイルとフォルダを意味します。

使用可能なスコープは次のとおりです。

  • fs - 全ファイルシステム
  • fs.read - ファイルシステム読み取り操作
  • fs.write - ファイルシステム書き込み操作
  • child - 子プロセスの生成操作
  • worker - ワーカースレッドの生成操作
// Check if the process has permission to read the README file
process.permission.has('fs.read', './README.md');
// Check if the process has read permission operations
process.permission.has('fs.read'); 

process.pid#

process.pid プロパティは、プロセスのPIDを返します。

import { pid } from 'node:process';

console.log(`This process is pid ${pid}`);const { pid } = require('node:process');

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

process.platform#

process.platform プロパティは、Node.js バイナリがコンパイルされたオペレーティングシステムプラットフォームを識別する文字列を返します。

現在可能な値は次のとおりです。

  • 'aix'
  • 'darwin'
  • 'freebsd'
  • 'linux'
  • 'openbsd'
  • 'sunos'
  • 'win32'
import { platform } from 'node:process';

console.log(`This platform is ${platform}`);const { platform } = require('node:process');

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

Node.js がAndroidオペレーティングシステム上でビルドされている場合、値'android'が返されることもあります。ただし、Node.jsにおけるAndroidサポートは実験段階です

process.ppid#

process.ppid プロパティは、現在のプロセスの親プロセスのPIDを返します。

import { ppid } from 'node:process';

console.log(`The parent process is pid ${ppid}`);const { ppid } = require('node:process');

console.log(`The parent process is pid ${ppid}`);

process.release#

process.release プロパティは、ソースのtarballとヘッダーのみのtarballのURLを含む、現在のリリースに関するメタデータを含むObjectを返します。

process.release は次のプロパティを含みます。

  • name <文字列> 常に'node'である値。
  • sourceUrl <文字列> 現在のリリースのソースコードを含む.tar.gzファイルへの絶対URL。
  • headersUrl <文字列> 現在のリリースのソースヘッダーファイルのみを含む.tar.gzファイルへの絶対URL。このファイルは完全なソースファイルよりも大幅に小さく、Node.js ネイティブアドオンのコンパイルに使用できます。
  • libUrl <文字列> | <未定義> 現在のリリースのアーキテクチャとバージョンに一致するnode.libファイルへの絶対URL。このファイルは、Node.js ネイティブアドオンのコンパイルに使用されます。このプロパティはWindowsビルドのNode.jsでのみ存在し、他のすべてのプラットフォームでは存在しません。
  • lts <文字列> | <未定義> このリリースのLTSラベルを識別する文字列ラベル。このプロパティはLTSリリースでのみ存在し、その他のすべてのリリースの種類(「Current」リリースを含む)ではundefinedです。有効な値には、LTSリリースのコード名(サポートされなくなったものも含む)が含まれます。
    • 14.15.0から始まる14.x LTSラインでは'Fermium'
    • 16.13.0から始まる16.x LTSラインでは'Gallium'
    • 18.12.0から始まる18.x LTSラインでは'Hydrogen'。他のLTSリリースのコード名については、Node.js変更ログアーカイブを参照してください。
{
  name: 'node',
  lts: 'Hydrogen',
  sourceUrl: 'https://node.dokyumento.jp/download/release/v18.12.0/node-v18.12.0.tar.gz',
  headersUrl: 'https://node.dokyumento.jp/download/release/v18.12.0/node-v18.12.0-headers.tar.gz',
  libUrl: 'https://node.dokyumento.jp/download/release/v18.12.0/win-x64/node.lib'
} 

ソースツリーの非リリースバージョンからのカスタムビルドでは、nameプロパティのみが存在する可能性があります。追加のプロパティが存在すると仮定すべきではありません。

process.report#

process.reportは、現在のプロセスの診断レポートを生成するために使用されるメソッドを持つオブジェクトです。レポートのドキュメントに追加のドキュメントがあります。

process.report.compact#

コンパクトな形式(単一行のJSON)でレポートを書き込みます。これは、人間が読むことを目的としたデフォルトの複数行形式よりも、ログ処理システムで簡単に使用できます。

import { report } from 'node:process';

console.log(`Reports are compact? ${report.compact}`);const { report } = require('node:process');

console.log(`Reports are compact? ${report.compact}`);

process.report.directory#

レポートが書き込まれるディレクトリ。デフォルト値は空文字列で、レポートはNode.jsプロセスの現在の作業ディレクトリに書き込まれることを示します。

import { report } from 'node:process';

console.log(`Report directory is ${report.directory}`);const { report } = require('node:process');

console.log(`Report directory is ${report.directory}`);

process.report.filename#

レポートが書き込まれるファイル名。空文字列に設定されている場合、出力ファイル名はタイムスタンプ、PID、シーケンス番号で構成されます。デフォルト値は空文字列です。

process.report.filenameの値が'stdout'または'stderr'に設定されている場合、レポートはそれぞれプロセスのstdoutまたはstderrに書き込まれます。

import { report } from 'node:process';

console.log(`Report filename is ${report.filename}`);const { report } = require('node:process');

console.log(`Report filename is ${report.filename}`);

process.report.getReport([err])#

  • err <Error> JavaScriptスタックを報告するために使用されるカスタムエラー。
  • 戻り値: <Object>

実行中のプロセスの診断レポートのJavaScriptオブジェクト表現を返します。レポートのJavaScriptスタックトレースは、存在する場合はerrから取得されます。

import { report } from 'node:process';
import util from 'node:util';

const data = report.getReport();
console.log(data.header.nodejsVersion);

// Similar to process.report.writeReport()
import fs from 'node:fs';
fs.writeFileSync('my-report.log', util.inspect(data), 'utf8');const { report } = require('node:process');
const util = require('node:util');

const data = report.getReport();
console.log(data.header.nodejsVersion);

// Similar to process.report.writeReport()
const fs = require('node:fs');
fs.writeFileSync('my-report.log', util.inspect(data), 'utf8');

レポートのドキュメントに追加のドキュメントがあります。

process.report.reportOnFatalError#

trueの場合、メモリ不足エラーやC++アサーションの失敗などの致命的なエラー時に診断レポートが生成されます。

import { report } from 'node:process';

console.log(`Report on fatal error: ${report.reportOnFatalError}`);const { report } = require('node:process');

console.log(`Report on fatal error: ${report.reportOnFatalError}`);

process.report.reportOnSignal#

trueの場合、プロセスがprocess.report.signalで指定されたシグナルを受信すると、診断レポートが生成されます。

import { report } from 'node:process';

console.log(`Report on signal: ${report.reportOnSignal}`);const { report } = require('node:process');

console.log(`Report on signal: ${report.reportOnSignal}`);

process.report.reportOnUncaughtException#

trueの場合、キャッチされない例外時に診断レポートが生成されます。

import { report } from 'node:process';

console.log(`Report on exception: ${report.reportOnUncaughtException}`);const { report } = require('node:process');

console.log(`Report on exception: ${report.reportOnUncaughtException}`);

process.report.signal#

診断レポートの作成をトリガーするために使用されるシグナル。デフォルトは'SIGUSR2'です。

import { report } from 'node:process';

console.log(`Report signal: ${report.signal}`);const { report } = require('node:process');

console.log(`Report signal: ${report.signal}`);

process.report.writeReport([filename][, err])#

  • filename <文字列> レポートが書き込まれるファイル名。これは相対パスにする必要があり、process.report.directoryで指定されたディレクトリ、または指定されていない場合はNode.jsプロセスの現在の作業ディレクトリに追加されます。

  • err <Error> JavaScriptスタックを報告するために使用されるカスタムエラー。

  • 戻り値: <文字列> 生成されたレポートのファイル名を返します。

診断レポートをファイルに書き込みます。filenameが提供されない場合、デフォルトのファイル名には日付、時刻、PID、シーケンス番号が含まれます。レポートのJavaScriptスタックトレースは、存在する場合はerrから取得されます。

filenameの値が'stdout'または'stderr'に設定されている場合、レポートはそれぞれプロセスのstdoutまたはstderrに書き込まれます。

import { report } from 'node:process';

report.writeReport();const { report } = require('node:process');

report.writeReport();

レポートのドキュメントに追加のドキュメントがあります。

process.resourceUsage()#

  • 戻り値: <オブジェクト> 現在のプロセスのリソース使用状況。これらの値はすべて、uv_rusage_t構造体を返すuv_getrusage呼び出しからのものです。
    • userCPUTime <整数> はマイクロ秒で計算されたru_utimeにマップされます。process.cpuUsage().userと同じ値です。
    • systemCPUTime <整数> はマイクロ秒で計算されたru_stimeにマップされます。process.cpuUsage().systemと同じ値です。
    • maxRSS <整数> はキロバイトで表される最大常駐セットサイズであるru_maxrssにマップされます。
    • sharedMemorySize <整数>ru_ixrssにマップされますが、どのプラットフォームでもサポートされていません。
    • unsharedDataSize <整数>ru_idrssにマップされますが、どのプラットフォームでもサポートされていません。
    • unsharedStackSize <整数>ru_isrssにマップされますが、どのプラットフォームでもサポートされていません。
    • minorPageFault <整数> はプロセスのマイナーページフォールトの数であるru_minfltにマップされます。この記事で詳細を確認してください
    • majorPageFault <整数> はプロセスのメジャーページフォールトの数であるru_majfltにマップされます。この記事で詳細を確認してください。このフィールドはWindowsではサポートされていません。
    • swappedOut <整数>ru_nswapにマップされますが、どのプラットフォームでもサポートされていません。
    • fsRead <整数> はファイルシステムが入力を実行する必要があった回数を表すru_inblockにマップされます。
    • fsWrite <整数>ru_oublock にマップされます。これは、ファイルシステムが出力を実行する必要があった回数を示します。
    • ipcSent <整数>ru_msgsnd にマップされますが、どのプラットフォームでもサポートされていません。
    • ipcReceived <整数>ru_msgrcv にマップされますが、どのプラットフォームでもサポートされていません。
    • signalsCount <整数>ru_nsignals にマップされますが、どのプラットフォームでもサポートされていません。
    • voluntaryContextSwitches <整数>ru_nvcsw にマップされます。これは、プロセスのタイムスライスが完了する前に、プロセスが自発的にプロセッサを解放した(通常はリソースの利用可能性を待つため)ことによってCPUコンテキストスイッチが発生した回数です。このフィールドはWindowsではサポートされていません。
    • involuntaryContextSwitches <整数>ru_nivcsw にマップされます。これは、優先度の高いプロセスが実行可能になったか、現在のプロセスがタイムスライスを超過したためにCPUコンテキストスイッチが発生した回数です。このフィールドはWindowsではサポートされていません。
import { resourceUsage } from 'node:process';

console.log(resourceUsage());
/*
  Will output:
  {
    userCPUTime: 82872,
    systemCPUTime: 4143,
    maxRSS: 33164,
    sharedMemorySize: 0,
    unsharedDataSize: 0,
    unsharedStackSize: 0,
    minorPageFault: 2469,
    majorPageFault: 0,
    swappedOut: 0,
    fsRead: 0,
    fsWrite: 8,
    ipcSent: 0,
    ipcReceived: 0,
    signalsCount: 0,
    voluntaryContextSwitches: 79,
    involuntaryContextSwitches: 1
  }
*/const { resourceUsage } = require('node:process');

console.log(resourceUsage());
/*
  Will output:
  {
    userCPUTime: 82872,
    systemCPUTime: 4143,
    maxRSS: 33164,
    sharedMemorySize: 0,
    unsharedDataSize: 0,
    unsharedStackSize: 0,
    minorPageFault: 2469,
    majorPageFault: 0,
    swappedOut: 0,
    fsRead: 0,
    fsWrite: 8,
    ipcSent: 0,
    ipcReceived: 0,
    signalsCount: 0,
    voluntaryContextSwitches: 79,
    involuntaryContextSwitches: 1
  }
*/

process.send(message[, sendHandle[, options]][, callback])#

  • message <オブジェクト>
  • sendHandle <net.Server> | <net.Socket>
  • options <オブジェクト> は、特定の種類のハンドルの送信をパラメータ化するために使用されます。options は次のプロパティをサポートします。
    • keepOpen <ブール値> net.Socket のインスタンスを渡す際に使用できる値です。true の場合、ソケットは送信プロセスで開いたままになります。 **デフォルト:** false
  • callback <Function>
  • 戻り値: <ブール値>

Node.js が IPC チャネルを使用して生成された場合、process.send() メソッドを使用して親プロセスにメッセージを送信できます。メッセージは、親の ChildProcess オブジェクトの 'message' イベントとして受信されます。

Node.js が IPC チャネルを使用して生成されなかった場合、process.sendundefinedになります。

メッセージはシリアライズとパースを経ます。結果として得られるメッセージは、最初に送信されたものとは異なる場合があります。

process.setegid(id)#

process.setegid() メソッドは、プロセスの有効なグループIDを設定します。(setegid(2) を参照してください。)id は、数値IDまたはグループ名の文字列として渡すことができます。グループ名が指定された場合、このメソッドは関連付けられた数値IDを解決する間ブロックされます。

import process from 'node:process';

if (process.getegid && process.setegid) {
  console.log(`Current gid: ${process.getegid()}`);
  try {
    process.setegid(501);
    console.log(`New gid: ${process.getegid()}`);
  } catch (err) {
    console.error(`Failed to set gid: ${err}`);
  }
}const process = require('node:process');

if (process.getegid && process.setegid) {
  console.log(`Current gid: ${process.getegid()}`);
  try {
    process.setegid(501);
    console.log(`New gid: ${process.getegid()}`);
  } catch (err) {
    console.error(`Failed to set gid: ${err}`);
  }
}

この関数はPOSIXプラットフォームでのみ使用可能です(つまり、WindowsやAndroidでは使用できません)。この機能は、Workerスレッドでは使用できません。

process.seteuid(id)#

process.seteuid() メソッドは、プロセスの有効なユーザーIDを設定します。(seteuid(2) を参照してください。)id は、数値IDまたはユーザー名の文字列として渡すことができます。ユーザー名が指定された場合、このメソッドは関連付けられた数値IDを解決する間ブロックされます。

import process from 'node:process';

if (process.geteuid && process.seteuid) {
  console.log(`Current uid: ${process.geteuid()}`);
  try {
    process.seteuid(501);
    console.log(`New uid: ${process.geteuid()}`);
  } catch (err) {
    console.error(`Failed to set uid: ${err}`);
  }
}const process = require('node:process');

if (process.geteuid && process.seteuid) {
  console.log(`Current uid: ${process.geteuid()}`);
  try {
    process.seteuid(501);
    console.log(`New uid: ${process.geteuid()}`);
  } catch (err) {
    console.error(`Failed to set uid: ${err}`);
  }
}

この関数はPOSIXプラットフォームでのみ使用可能です(つまり、WindowsやAndroidでは使用できません)。この機能は、Workerスレッドでは使用できません。

process.setgid(id)#

process.setgid() メソッドは、プロセスのグループIDを設定します。(setgid(2) を参照してください。)id は、数値IDまたはグループ名の文字列として渡すことができます。グループ名が指定された場合、このメソッドは関連付けられた数値IDを解決する間ブロックされます。

import process from 'node:process';

if (process.getgid && process.setgid) {
  console.log(`Current gid: ${process.getgid()}`);
  try {
    process.setgid(501);
    console.log(`New gid: ${process.getgid()}`);
  } catch (err) {
    console.error(`Failed to set gid: ${err}`);
  }
}const process = require('node:process');

if (process.getgid && process.setgid) {
  console.log(`Current gid: ${process.getgid()}`);
  try {
    process.setgid(501);
    console.log(`New gid: ${process.getgid()}`);
  } catch (err) {
    console.error(`Failed to set gid: ${err}`);
  }
}

この関数はPOSIXプラットフォームでのみ使用可能です(つまり、WindowsやAndroidでは使用できません)。この機能は、Workerスレッドでは使用できません。

process.setgroups(groups)#

process.setgroups() メソッドは、Node.js プロセスの補助グループIDを設定します。これは、Node.js プロセスがrootまたはCAP_SETGID機能を持っている必要がある特権操作です。

groups 配列には、数値のグループID、グループ名、またはその両方を含めることができます。

import process from 'node:process';

if (process.getgroups && process.setgroups) {
  try {
    process.setgroups([501]);
    console.log(process.getgroups()); // new groups
  } catch (err) {
    console.error(`Failed to set groups: ${err}`);
  }
}const process = require('node:process');

if (process.getgroups && process.setgroups) {
  try {
    process.setgroups([501]);
    console.log(process.getgroups()); // new groups
  } catch (err) {
    console.error(`Failed to set groups: ${err}`);
  }
}

この関数はPOSIXプラットフォームでのみ使用可能です(つまり、WindowsやAndroidでは使用できません)。この機能は、Workerスレッドでは使用できません。

process.setuid(id)#

process.setuid(id) メソッドは、プロセスのユーザーIDを設定します。(setuid(2) を参照してください。)id は、数値IDまたはユーザー名の文字列として渡すことができます。ユーザー名が指定された場合、このメソッドは関連付けられた数値IDを解決する間ブロックされます。

import process from 'node:process';

if (process.getuid && process.setuid) {
  console.log(`Current uid: ${process.getuid()}`);
  try {
    process.setuid(501);
    console.log(`New uid: ${process.getuid()}`);
  } catch (err) {
    console.error(`Failed to set uid: ${err}`);
  }
}const process = require('node:process');

if (process.getuid && process.setuid) {
  console.log(`Current uid: ${process.getuid()}`);
  try {
    process.setuid(501);
    console.log(`New uid: ${process.getuid()}`);
  } catch (err) {
    console.error(`Failed to set uid: ${err}`);
  }
}

この関数はPOSIXプラットフォームでのみ使用可能です(つまり、WindowsやAndroidでは使用できません)。この機能は、Workerスレッドでは使用できません。

process.setSourceMapsEnabled(val)#

安定性: 1 - 実験的

この関数は、スタックトレースに対する Source Map v3 のサポートを有効または無効にします。

これは、コマンドラインオプション--enable-source-mapsを使用してNode.jsプロセスを起動することと同じ機能を提供します。

ソースマップが有効になった後にロードされたJavaScriptファイル内のソースマップのみが解析およびロードされます。

process.setUncaughtExceptionCaptureCallback(fn)#

process.setUncaughtExceptionCaptureCallback()関数は、キャッチされない例外が発生したときに呼び出される関数を設定します。この関数は、最初の引数として例外値自体を受け取ります。

このような関数が設定されている場合、'uncaughtException' イベントは発生しません。コマンドラインから--abort-on-uncaught-exceptionが渡された場合、またはv8.setFlagsFromString()を通じて設定された場合、プロセスは異常終了しません。レポートの生成など、例外時に実行するように構成されたアクションも影響を受けます。

キャプチャ関数をリセットするには、process.setUncaughtExceptionCaptureCallback(null)を使用できます。別のキャプチャ関数が設定されている間にnull以外の引数でこのメソッドを呼び出すと、エラーが発生します。

この関数の使用は、非推奨のdomain組み込みモジュールの使用と相互に排他的です。

process.sourceMapsEnabled#

安定性: 1 - 実験的

process.sourceMapsEnabledプロパティは、スタックトレースに対するSource Map v3のサポートが有効かどうかを返します。

process.stderr#

process.stderrプロパティは、stderr(fd 2)に接続されたストリームを返します。 fd 2がファイルを参照する場合、書き込み可能ストリームになりますが、それ以外の場合はnet.Socket双方向ストリーム)です。

process.stderrは、他のNode.jsストリームとは重要な点で異なります。詳細については、プロセスI/Oに関する注記を参照してください。

process.stderr.fd#

このプロパティは、process.stderrの基になるファイル記述子の値を参照します。値は2に固定されています。Workerスレッドでは、このフィールドは存在しません。

process.stdin#

process.stdinプロパティは、stdin(fd 0)に接続されたストリームを返します。 fd 0がファイルを参照する場合、読み取り可能ストリームになりますが、それ以外の場合はnet.Socket双方向ストリーム)です。

stdinからの読み取り方法の詳細については、readable.read()を参照してください。

双方向ストリームとして、process.stdinは、v0.10より前のNode.js用に記述されたスクリプトと互換性のある「古い」モードでも使用できます。詳細については、ストリームの互換性を参照してください。

「古い」ストリームモードでは、stdinストリームはデフォルトで一時停止されるため、process.stdin.resume()を呼び出してから読み取る必要があります。また、process.stdin.resume()を呼び出すこと自体がストリームを「古い」モードに切り替えることに注意してください。

process.stdin.fd#

このプロパティは、process.stdinの基になるファイル記述子の値を参照します。値は0に固定されています。Workerスレッドでは、このフィールドは存在しません。

process.stdout#

process.stdoutプロパティは、stdout(fd 1)に接続されたストリームを返します。 fd 1がファイルを参照する場合、書き込み可能ストリームになりますが、それ以外の場合はnet.Socket双方向ストリーム)です。

たとえば、process.stdinprocess.stdoutにコピーするには

import { stdin, stdout } from 'node:process';

stdin.pipe(stdout);const { stdin, stdout } = require('node:process');

stdin.pipe(stdout);

process.stdout は、他の Node.js ストリームとは重要な点で異なります。プロセスI/Oに関する注記 を参照してください。

process.stdout.fd#

このプロパティは、process.stdout の基となるファイルディスクリプタの値を参照します。値は 1 に固定されています。Worker スレッドでは、このフィールドは存在しません。

プロセスI/Oに関する注記#

process.stdoutprocess.stderr は、他の Node.js ストリームとは重要な点で異なります。

  1. これらは内部的に console.log()console.error() でそれぞれ使用されます。
  2. 書き込みは、ストリームが接続されているものと、システムが 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 の初期値は、現在の Node.js プロセスで --throw-deprecation フラグが設定されているかどうかを示します。process.throwDeprecation は変更可能であるため、非推奨警告がエラーになるかどうかは実行時に変更できます。'warning' イベントemitWarning() メソッド のドキュメントを参照してください。

$ node --throw-deprecation -p "process.throwDeprecation"
true
$ node -p "process.throwDeprecation"
undefined
$ node
> process.emitWarning('test', 'DeprecationWarning');
undefined
> (node:26598) DeprecationWarning: test
> process.throwDeprecation = true;
true
> process.emitWarning('test', 'DeprecationWarning');
Thrown:
[DeprecationWarning: test] { name: 'DeprecationWarning' } 

process.title#

process.title プロパティは、現在のプロセスタイトルを返します(つまり、ps の現在の値を返します)。process.title に新しい値を代入すると、ps の現在の値が変更されます。

新しい値を代入すると、異なるプラットフォームでタイトルに対する最大長制限が異なります。通常、そのような制限は非常に限られています。例えば、Linux と macOS では、process.title はバイナリ名とコマンドライン引数の長さの合計に制限されています。これは、process.title を設定するとプロセスの argv メモリが上書きされるためです。Node.js v0.8 では、environ メモリも上書きすることでより長いプロセスタイトル文字列を許可していましたが、これはいくつかの(かなり分かりにくい)ケースで潜在的に安全ではなく、混乱を招く可能性がありました。

process.title に値を代入しても、macOS アクティビティモニタや Windows サービスマネージャーなどのプロセス管理アプリケーション内で正確なラベルが表示されない場合があります。

process.traceDeprecation#

process.traceDeprecation プロパティは、現在の Node.js プロセスで --trace-deprecation フラグが設定されているかどうかを示します。'warning' イベントemitWarning() メソッド のドキュメントを参照して、このフラグの動作の詳細を確認してください。

process.umask()#

安定性: 0 - 非推奨。引数なしで process.umask() を呼び出すと、プロセス全体の umask が2回書き込まれます。これにより、スレッド間の競合状態が発生し、潜在的なセキュリティ脆弱性が生じる可能性があります。安全でクロスプラットフォームな代替APIはありません。

process.umask() は、Node.js プロセスのファイルモード作成マスクを返します。子プロセスは、親プロセスからマスクを継承します。

process.umask(mask)#

process.umask(mask) は、Node.js プロセスのファイルモード作成マスクを設定します。子プロセスは、親プロセスからマスクを継承します。以前のマスクを返します。

import { umask } from 'node:process';

const newmask = 0o022;
const oldmask = umask(newmask);
console.log(
  `Changed umask from ${oldmask.toString(8)} to ${newmask.toString(8)}`,
);const { umask } = require('node:process');

const newmask = 0o022;
const oldmask = umask(newmask);
console.log(
  `Changed umask from ${oldmask.toString(8)} to ${newmask.toString(8)}`,
);

Worker スレッドでは、process.umask(mask) は例外をスローします。

process.uptime()#

process.uptime() メソッドは、現在の Node.js プロセスが実行されている秒数を返します。

戻り値には、秒の小数部分も含まれます。整数秒を取得するには、Math.floor() を使用します。

process.version#

process.version プロパティには、Node.js のバージョン文字列が含まれています。

import { version } from 'node:process';

console.log(`Version: ${version}`);
// Version: v14.8.0const { version } = require('node:process');

console.log(`Version: ${version}`);
// Version: v14.8.0

先頭の *v* を除いたバージョン文字列を取得するには、process.versions.node を使用します。

process.versions#

process.versions プロパティは、Node.js とその依存関係のバージョン文字列を一覧表示するオブジェクトを返します。process.versions.modules は現在の ABI バージョンを示しており、C++ API が変更されるたびに増加します。Node.js は、異なるモジュール ABI バージョンに対してコンパイルされたモジュールの読み込みを拒否します。

import { versions } from 'node:process';

console.log(versions);const { versions } = require('node:process');

console.log(versions);

次のようなオブジェクトを生成します。

{ node: '20.2.0',
  acorn: '8.8.2',
  ada: '2.4.0',
  ares: '1.19.0',
  base64: '0.5.0',
  brotli: '1.0.9',
  cjs_module_lexer: '1.2.2',
  cldr: '43.0',
  icu: '73.1',
  llhttp: '8.1.0',
  modules: '115',
  napi: '8',
  nghttp2: '1.52.0',
  nghttp3: '0.7.0',
  ngtcp2: '0.8.1',
  openssl: '3.0.8+quic',
  simdutf: '3.2.9',
  tz: '2023c',
  undici: '5.22.0',
  unicode: '15.0',
  uv: '1.44.2',
  uvwasi: '0.0.16',
  v8: '11.3.244.8-node.9',
  zlib: '1.2.13' } 

終了コード#

Node.js は、保留中の非同期操作がなくなった場合、通常はステータスコード 0 で終了します。他のケースでは、次のステータスコードが使用されます。

  • 1 キャッチされない致命的な例外: キャッチされない例外が発生し、ドメインまたは 'uncaughtException' イベントハンドラによって処理されませんでした。
  • 2: 使用されていません(Bash によって組み込みの誤用のために予約されています)。
  • 3 内部 JavaScript パースエラー: Node.js ブートストラッププロセス内の内部 JavaScript ソースコードでパースエラーが発生しました。これは非常にまれであり、一般的に Node.js 自体の開発中にのみ発生する可能性があります。
  • 4 内部 JavaScript 評価失敗: Node.js ブートストラッププロセス内の内部 JavaScript ソースコードは、評価されたときに関数値を返せませんでした。これは非常にまれであり、一般的に Node.js 自体の開発中にのみ発生する可能性があります。
  • 5 致命的なエラー: V8 で回復不可能な致命的なエラーが発生しました。通常、FATAL ERROR というプレフィックスが付いたメッセージが stderr に出力されます。
  • 6 関数以外の内部例外ハンドラ: キャッチされない例外が発生しましたが、内部の致命的な例外ハンドラ関数が何らかの理由で関数に設定されておらず、呼び出すことができませんでした。
  • 7 内部例外ハンドラのランタイムエラー: キャッチされない例外が発生し、内部の致命的な例外ハンドラ関数自体が処理を試行中にエラーをスローしました。これは、例えば、'uncaughtException' または domain.on('error') ハンドラがエラーをスローした場合に発生する可能性があります。
  • 8: 使用されていません。以前のバージョンの Node.js では、終了コード 8 はキャッチされない例外を示すことがありました。
  • 9 無効な引数: 不明なオプションが指定されたか、値を必要とするオプションに値が指定されませんでした。
  • 10 内部 JavaScript ランタイムエラー: Node.js ブートストラッププロセス内の内部 JavaScript ソースコードは、ブートストラップ関数が呼び出されたときにエラーをスローしました。これは非常にまれであり、一般的に Node.js 自体の開発中にのみ発生する可能性があります。
  • 12 無効なデバッグ引数: --inspect および/または --inspect-brk オプションが設定されていましたが、選択されたポート番号が無効か、使用できませんでした。
  • 13 未完了のトップレベル await: トップレベルコード内で関数以外で await が使用されましたが、渡された Promise が解決されませんでした。
  • 14 スナップショット失敗: Node.js は V8 スタートアップスナップショットを作成するために起動されましたが、アプリケーションの状態の特定の要件が満たされなかったため失敗しました。
  • >128 シグナルによる終了: Node.js が SIGKILLSIGHUP などの致命的なシグナルを受け取ると、その終了コードはシグナルコードの値に 128 を加えたものになります。これは標準的な POSIX の慣習であり、終了コードは 7 ビットの整数として定義されており、シグナル終了は最上位ビットを設定し、シグナルコードの値を含みます。例えば、シグナル SIGABRT の値は 6 なので、予想される終了コードは 128 + 6、つまり 134 になります。