You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
pm2 monit / pm2 dash now 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
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's process.env after 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
pane
pm2 monit: the footer no longer overlaps the bottom border of the Custom Metrics / Metadata
panes
pm2 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/blessed is now vendored in modules/blessed (one less npm dependency)
chokidar 3.6.0 is now vendored in modules/chokidar with a bounded brace expansion, dropping
the vulnerable braces dependency (GHSA-vfj7-8cjw-p6xm, no patched version)
Logs: no more lost lines in fork mode with --time / log_date_format when 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 0 now streams matching apps (regex was ignored in stream-only mode);
regexes with an inner / are no longer mangled, apps started after pm2 logs are picked up, and
only one bus subscription is opened #5196
pm2 reloadLogs no longer crashes the app in fork mode when out_file/error_file are NULL
and only log_file is set #5509
Logs: log streams are now flushed (end()) instead of destroyed on pm2 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 stdio inherit) no longer ends up in pm2.log — workers get piped stdio and
the daemon routes it to the app log files and pm2 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: cluster on a non Node.js/Bun script (bash, python, binary) now falls back to fork
mode with a warning instead of crashing with SyntaxError: 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 with Callback was already called#6171
TreeKill: no ps under 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 invalid spam) #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 reloadLogs no longer crashes the daemon (ERR_IPC_CHANNEL_CLOSED) nor leaks fds when a
cluster app is stopped, nor on concurrent calls
Explicit exec_mode: cluster is 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 (--spa no longer crashes on GET /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 close that sometimes never comes on Linux (2 fds leaked per app stop/restart/delete)
Stale _tree_pids from 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_PROXY support removed with the proxy-agent dependency (unused, broken since
7.0.0 with ProxyAgent 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 in env:
pm2 ls host metrics: virtual interfaces and read-only mounts are hidden