线上某些基于 nodejs 的服务时不时看到这种进程,而且一直都在:
root 25997 1 0 Mar25 ? 00:00:00 /root/.nvm/versions/node/v10.14.2/bin/node /root/.nvm/versions/node/v10.14.2/lib/node_modules/npm/node_modules/update-notifier/check.js {"pkg":{"name":"npm","version":"6.4.1"}}
经过检查判断,这是 npm 带来的一个依赖模块,用来做版本检测。
检查 npm 和 update-notifier 的源码之后,可以了解到其工作方式:
- npm 每次调用都会判断是否需要检查版本号
$HOME/.config/configstore/update-notifier-npm.json
- npm 配置中的
update-notifier
- 然后将自己的 package.json 数据做参数,传递给 update-notifier
- update-notifiler 提取出 name 和 version,然后创建一个新的进程来获取最新版本,判断是否需要升级
至于那几个进程为什么滞留,就不知道原因了,可能是有 BUG。
线上服务还是稳定第一,没有问题就不轻易升级。
直接对那几个 update-notifier 进程 kill -9
,并 npm config set update-notifier false --global
一下。
实验:手动触发版本检查
sudo npm i -g update-notifier
export NODE_PATH=$(npm root --quiet -g)
echo '{"optOut": false, "lastUpdateCheck": 0}' > ~/.config/configstore/update-notifier-npm.json
node -e "const pkg=require('/usr/lib/nodejs/npm/package.json');console.log(require('update-notifier')({pkg}));"
echo '{"optOut": false, "lastUpdateCheck": 0}' > ~/.config/configstore/update-notifier-npm.json
npm search npm
配合 Python 写的进程监控脚本,可以看到下面这种进程出现,和 update-notifier 中的逻辑一致。
USER PID %MEM VSZ RSS NICE STATUS START TIME CMDLINE
catroll 10714 0.3 630876 17244 ? R 14:32 00:00 /usr/bin/node /usr/local/lib/node_modules/npm/node_modules/update-notifier/check.js {"pkg":{"name":"npm","version":"6.8.0"}}