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 #5187pm2 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 #5196pm2 reloadLogsno longer crashes the app in fork mode whenout_file/error_fileareNULL
and 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
ChildProcessclosethat 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