使用PM2运行SSH服务器时颜色丢失的原因排查
PM2导致SSH服务器颜色输出丢失的问题解析及解决办法
问题根源
PM2默认会把进程的stdout/stderr重定向到日志文件,而非交互式的管道或文件流不支持ANSI颜色控制码。chalk这类着色库会自动检测输出环境是不是TTY(终端设备),如果判定不是,就会自动关掉颜色输出——哪怕你设置了FORCE_COLOR,也可能因为PM2没把环境变量正确传递给子进程而失效。
另外,PM2启动进程时默认不给子进程分配TTY终端,这直接导致chalk检测不到终端环境,自然就不会输出颜色了。
解决办法
1. 启动PM2时强制分配TTY
启动命令加--tty参数,让PM2给子进程创建伪终端,这样chalk就能识别到TTY环境,正常输出颜色:
pm2 start your-server-script.ts --interpreter ts-node --tty
2. 代码里强制chalk开启着色
直接在代码里设置chalk的level属性,跳过环境检测,强制开启颜色:
import chalk from 'chalk'; // 3代表真彩色,0=关闭,1=基础色,2=256色,按需选择 chalk.level = 3;
3. PM2配置文件里指定环境变量
如果用ecosystem.config.js这类配置文件,在env里明确设置FORCE_COLOR,同时可选开启tty:
module.exports = { apps: [{ name: 'ssh-server', script: 'your-server-script.ts', interpreter: 'ts-node', env: { FORCE_COLOR: '3', DEBUG_COLORS: 'true' }, tty: true // 可选,配合TTY分配 }] };
注意事项
- 查看PM2日志文件时,会看到类似
\x1b[32m的颜色控制码文本,这是正常的——日志文件本身不解析ANSI码,但SSH客户端连接时应该能正常显示彩色内容。 - 如果客户端还是看不到颜色,先确认你的终端支持ANSI颜色,再检查PM2日志里有没有输出对应的颜色控制码,确保服务器端确实生成了着色内容。
内容的提问来源于stack exchange,提问作者nullromo
相关产品推荐
相关产品推荐

