问题
在 top
或 ps
命令中,显示的路径不完全,如应该显示:
node /nodejs/script/path
却显示:
node /nodejs/script/pa
原因
- 首先明确这不是
top
或ps
显示的问题 - node在v0.8以前支持通过uv_set_process_title()方法覆盖系统的environ变量来生成进程名称
- 由于系统原因,这种方式不安全也不一定有效,在之后的node版本中便不再支持这种方式
- 现在,进程名称长度被限制为 二进制名称长度 + 参数长度
现象
如一个js脚本绝对路径为:/tmp/server.js
$ cd /tmp
$ pm2 start ./server.js --name myapp1 -- arg1 arg2
进程名长度被限制为:len("/tmp/server.js") + len(" arg1 arg2") = 24
在ps中会显示为:
root 5370 1 0 Apr06 ? 00:00:28 node /tmp/server.js
如果不添加参数:
$ cd /tmp
$ pm2 start ./server.js --name myapp2
进程名长度被限制为:len("/tmp/server.js") + len("") = 14
在ps中会显示为:
root 5370 1 0 Apr06 ? 00:00:28 node /tmp/serv
因为 len("node /tmp/serv") = 14
注意,如果使用ecosystem.config.js来启动,里面配置的参数貌似不会增加参数长度,而如果用pm2直接启动js脚本,所传递的参数是生效的(如上所示)
解决
如果不想使用pm2默认返回的进程名称,可以通过设置PROCESS_TITLE来自定义较短的进程名称
设置方法有两种:
1. $ export PROCESS_TITLE="xxxxx" && pm2 start myscript.js --env production
2. 在ecosystem.config.js里的env_production字段里添加`PROCESS_TITLE: "xxxxxxx"`
参考链接:
https://github.com/Unitech/pm2/issues/3749
https://nodejs.cn/api/process/process_title.html
https://github.com/nodejs/node-v0.x-archive/issues/5006