| Name | Modified | Size | Downloads / Week |
|---|---|---|---|
| Parent folder | |||
| README.md | 2026-10-21 | 5.5 kB | |
| v7.1.0 source code.tar.gz | 2026-10-21 | 2.4 MB | |
| v7.1.0 source code.zip | 2026-10-21 | 2.7 MB | |
| Totals: 3 Items | 5.1 MB | 1 | |
7.1.0
Features
pm2 monit/pm2 dashnow preload the last 200 lines (out + err merged) of every process from its log files, most recent first;--lines <n>to display more [#5187]pm2 monit: Ctrl+Up / Ctrl+Down (and PageUp / PageDown) scroll the focused log pane page by page
Bug Fixes
- Shell environment variables named like a PM2 option (
name,namespace,cron_restart,instances...) no longer override the app configuration [#6006] [#6016] [#5747] [#5622] [#5030] [#5032] [#4943] [#4778] [#4821] [#3210] - Variables declared in
env:and named like a PM2 option (env: { port: 3000 },time,watch...) still reach the app: only the ambient shell environment is filtered, not what the user declares - Cluster mode: the pid list of the previous kill (
_tree_pids, since 7.0.0) no longer leaks into the app'sprocess.envafter a restart, nor gets reused as the pid list of a later kill pm2 monit: align the Custom Metrics pane in columns (value right-aligned, fixed unit column, numbers rounded to 2 decimals) and shorten long metric names instead of pushing values out of the panepm2 monit: the footer no longer overlaps the bottom border of the Custom Metrics / Metadata panespm2 monit: logs, metrics and metadata panes update instantly when the selected process changes (no longer wait for the next refresh tick)pm2 monit: characters of old log lines no longer stay stuck on screen — emoji are now measured as 2 cells, and\r, cursor escape sequences, control chars and{tags}in logs are sanitized [#5397]@pm2/blessedis now vendored inmodules/blessed(one less npm dependency)chokidar3.6.0 is now vendored inmodules/chokidarwith a bounded brace expansion, dropping the vulnerablebracesdependency (GHSA-vfj7-8cjw-p6xm, no patched version)- Logs: no more lost lines in fork mode with
--time/log_date_formatwhen an app writes more than 64KB at once (partial line at a pipe chunk boundary was dropped) [#6125] - Logs: in cluster mode with
--time, every line of a multi-line write is now date-prefixed (not only the first) pm2 logs "/regex/" --lines 0now streams matching apps (regex was ignored in stream-only mode); regexes with an inner/are no longer mangled, apps started afterpm2 logsare picked up, and only one bus subscription is opened [#5196]pm2 reloadLogsno longer crashes the app in fork mode whenout_file/error_fileareNULLand onlylog_fileis set [#5509]- Logs: log streams are now flushed (
end()) instead of destroyed onpm2 reloadLogs/ app exit, so buffered data is no longer truncated pm2 serve: a request with a malformed percent-escape (GET /%) no longer crashes the server (answers 400); handler exceptions answer 500 instead of killing the process- Logs: in cluster mode, output that bypasses
process.stdout.write(pino/sonic-boom,npm start, children spawned with stdioinherit) no longer ends up inpm2.log— workers get piped stdio and the daemon routes it to the app log files andpm2 logs[#3675] [#4719] [#4872] [#4916] [#4953] [#5633] [#4816] - Logs: in cluster mode, the worker's stdout/stderr pipes are made blocking so a raw write bigger
than the pipe buffer (
fs.writeSync(1, ...), native addons) is no longer silently truncated at 64 KB [#4044] [#4872] exec_mode: clusteron a non Node.js/Bun script (bash, python, binary) now falls back to fork mode with a warning instead of crashing withSyntaxError: Invalid or unexpected token(ELF) [#4775]- Node.js/Bun interpreter detection now accepts atypical binary names (
node.exe,node64.exe,nodejs,node18,node@18,bun.exe), so cluster mode and the fork-mode wrapper are no longer skipped for them - Restart/stop on systems without
ps(slim Docker images) no longer starts the app twice and crashes the daemon withCallback was already called[#6171] - TreeKill: no
psunder Bun (synchronous spawn throw) falls back to killing the root pid - An online process without a pid (e.g. failed spawn) no longer makes pidusage fail for every app
(
One of the pids provided is invalidspam) [#6134] [#6135] - Cluster mode with
uid/gid: log files created by a root daemon are chowned to the app user (no more EACCES crash loop) pm2 reloadLogsno longer crashes the daemon (ERR_IPC_CHANNEL_CLOSED) nor leaks fds when a cluster app is stopped, nor on concurrent calls- Explicit
exec_mode: clusteris kept for JS/TS apps run by a custom interpreter (tsx,ts-node); fork fallback only for binaries and non-JS scripts/interpreters [#4775] pm2 serve: null bytes answer 400 (--spano longer crashes onGET /x/%2500), errors in async file handlers answer 500- Fork/cluster: log files are closed once the app stdout/stderr pipes are closed, no longer on the
ChildProcess
closethat sometimes never comes on Linux (2 fds leaked per app stop/restart/delete) - Stale
_tree_pidsfrom a 7.0.0-7.0.4 dump no longer leaks into the app env nor gets an unrelated pid SIGKILLed on stop - PM2.io agent:
PM2_PROXYsupport removed with theproxy-agentdependency (unused, broken since 7.0.0 withProxyAgent is not a constructor; drops the vulnerable get-uri/basic-ftp chain) - Behavior change: shell variables named like a PM2 option (
port,time,watch...) are no longer forwarded to fork mode apps; declare them inenv: pm2 lshost metrics: virtual interfaces and read-only mounts are hidden