# cfork

> cluster fork and restart easy way

Latest version **2.0.0** (published 2024-12-15) · MIT license · 0 weekly downloads

## Install

```sh
npm install cfork
pnpm add cfork
yarn add cfork
bun add cfork
```

## Health

**Score 55/100 (C)** — status: stable.

Positive: has types; esm support; no vulnerabilities; has provenance; high quality score.

Warnings: low downloads.

Negative: stale.

## Facts

| | |
|---|---|
| Version | 2.0.0 |
| Published | 2024-12-15 |
| First published | 2014-08-04 |
| Weekly downloads | 0 |
| License | MIT |
| TypeScript types | bundled |
| Module format | ESM + CommonJS |
| Node | >= 18.19.0 |
| Dependencies | 1 |
| Unpacked size | 71.1 KB |
| Known vulnerabilities | 0 |
| Install scripts | no |
| Provenance | attested (GitHub Actions) |
| GitHub stars | 158 |
| Author | fengmk2 |
| Maintainers | dead_horse, fengmk2, popomore |
| Keywords | cluster, cluster-fork, cfork, restart |

## Links

- npm: https://www.npmjs.com/package/cfork
- Repository: https://github.com/node-modules/cfork
- Issues: https://github.com/node-modules/cfork/issues
- npm.io page: https://npm.io/package/cfork

## Dependencies (1)

- [utility](https://npm.io/package/utility.md) ^2.2.0

## Alternatives

- [lodash.startswith](https://npm.io/package/lodash.startswith.md) — 769.7K weekly downloads
- [@tarojs/service](https://npm.io/package/@tarojs/service.md) — 33.9K weekly downloads
- [io.extendreality.tilia.indicators.spatialtargets.unity](https://npm.io/package/io.extendreality.tilia.indicators.spatialtargets.unity.md) — 131 weekly downloads
- [@rtarojs/taro](https://npm.io/package/@rtarojs/taro.md) — 90 weekly downloads
- [node-branch-io](https://npm.io/package/node-branch-io.md) — 50 weekly downloads

## Recent versions

- 2.0.0 (latest) — 2024-12-15
- 1.11.0 — 2024-05-24
- 1.10.0 — 2024-02-23
- 1.9.0 — 2023-05-05
- 1.8.0 — 2019-06-13
- 1.7.1 — 2017-11-07
- 1.7.0 — 2017-09-25
- 1.6.1 — 2017-06-10
- 1.6.0 — 2016-11-18
- 1.5.1 — 2016-06-23
- 1.5.0 — 2016-05-06
- 1.4.0 — 2015-11-04
- 1.3.1 — 2015-08-30
- 1.3.0 — 2015-08-30
- 1.2.4 — 2015-06-03
- … 8 more at https://npm.io/package/cfork/versions

## README

# cfork

[![NPM version][npm-image]][npm-url]
[![Node.js CI](https://github.com/node-modules/cfork/actions/workflows/nodejs.yml/badge.svg)](https://github.com/node-modules/cfork/actions/workflows/nodejs.yml)
[![Test coverage][codecov-image]][codecov-url]
[![npm download][download-image]][download-url]
[![Node.js Version](https://img.shields.io/node/v/cfork.svg?style=flat)](https://nodejs.org/en/download/)

[npm-image]: https://img.shields.io/npm/v/cfork.svg?style=flat-square
[npm-url]: https://npmjs.org/package/cfork
[codecov-image]: https://codecov.io/gh/node-modules/cfork/branch/master/graph/badge.svg
[codecov-url]: https://codecov.io/gh/node-modules/cfork
[download-image]: https://img.shields.io/npm/dm/cfork.svg?style=flat-square
[download-url]: https://npmjs.org/package/cfork

cluster fork and restart easy way.

* Easy fork with worker file path
* Handle worker restart, even it was exit unexpected.
* Auto error log process `uncaughtException` event

## Install

```bash
npm install cfork
```

## Usage

### ESM and TypeScript

```ts
import util from 'node:util';
import { cfork } from 'cfork';

const clusterWorker = cfork({
  exec: '/your/app/worker.js',
  // slaves: ['/your/app/slave.js'],
  // count: require('os').cpus().length,
}).on('fork', worker => {
    console.warn('[%s] [worker:%d] new worker start', Date(), worker.process.pid);
  })
  .on('disconnect', worker => {
    console.warn('[%s] [master:%s] wroker:%s disconnect, exitedAfterDisconnect: %s, state: %s.',
      Date(), process.pid, worker.process.pid, worker.exitedAfterDisconnect, worker.state);
  })
  .on('exit', (worker, code, signal) => {
    const exitCode = worker.process.exitCode;
    const err = new Error(util.format('worker %s died (code: %s, signal: %s, exitedAfterDisconnect: %s, state: %s)',
      worker.process.pid, exitCode, signal, worker.exitedAfterDisconnect, worker.state));
    err.name = 'WorkerDiedError';
    console.error('[%s] [master:%s] wroker exit: %s', Date(), process.pid, err.stack);
  })
  // if you do not listen to this event
  // cfork will output this message to stderr
  .on('unexpectedExit', (worker, code, signal) => {
    // logger what you want
  })
  // emit when reach refork times limit
  .on('reachReforkLimit', () => {
    // do what you want
  });

// if you do not listen to this event
// cfork will listen it and output the error message to stderr
process.on('uncaughtException', err => {
  // do what you want
});

// if you want to dynamically disable refork, you can call the setDisableRefork, priority over the refork parameter
cfork.setDisableRefork(clusterWorker, true);
```

### CommonJS

```js
const { cfork } = require('cfork');
```

### Options

* **exec** : exec file path
* **slaves** : slave process config
* **args** : exec arguments
* **count** : fork worker nums, default is `os.cpus().length`
* **refork** : refork when worker disconnect or unexpected exit, default is `true`
* **limit**: limit refork times within the `duration`, default is `60`
* **duration**: default is `60000`, one minute (so, the `refork times` < `limit / duration`)
* **autoCoverage**: auto fork with istanbul when `running_under_istanbul` env set, default is `false`
* **env**: attach some environment variable key-value pairs to the worker / slave process, default to an empty object.
* **windowsHide**: Hide the forked processes console window that would normally be created on Windows systems, default to false.
* **serialization**: Specify the kind of serialization used for sending messages between processes. Possible values are 'json' and 'advanced'. See Advanced serialization for child_process for more details. Default: false.

## License

[MIT](LICENSE)

## Contributors

[![Contributors](https://contrib.rocks/image?repo=node-modules/cfork)](https://github.com/node-modules/cfork/graphs/contributors)

Made with [contributors-img](https://contrib.rocks).

---
_Source: https://npm.io/package/cfork · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
