TOC

npm 的 update-notifier

线上某些基于 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 的源码之后,可以了解到其工作方式:

  1. npm 每次调用都会判断是否需要检查版本号
    1. $HOME/.config/configstore/update-notifier-npm.json
    2. npm 配置中的 update-notifier
  2. 然后将自己的 package.json 数据做参数,传递给 update-notifier
  3. 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
markjour    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"}}