systemd服务执行npm run start失败,但手动运行正常的问题
问题
我的Node.js服务通过systemd启动时报错,但手动运行正常,具体情况如下:
systemd服务文件
[Unit] Description=Nodejs Server [Service] WorkingDirectory=/home/projects ExecStart=npm run start Restart=always [Install] WantedBy=multi-user.target After=multi-user.target
报错信息
SyntaxError: Unexpected token '.' at wrapSafe (internal/modules/cjs/loader.js:915:16) at Module._compile (internal/modules/cjs/loader.js:963:27) at Object.Module._extensions..js (internal/modules/cjs/loader.js) at Module.load (internal/modules/cjs/loader.js:863:32) at Function.Module._load (internal/modules/cjs/loader.js:708:14) at Module.require (internal/modules/cjs/loader.js:887:19) at require (internal/modules/cjs/helpers.js:74:18) at Object.<anonymous> (/home/projects/node_modules/web3-core/lib/extend.js:24:14) at Module._compile (internal/modules/cjs/loader.js:999:30) at Object.Module._extensions..js (internal/modules/cjs/loader.js:1027:10) [nodemon] app crashed - waiting for file changes before starting...
背景情况
项目此前正常运行数月,添加web3依赖后出现该问题。手动进入项目目录执行npm run start完全正常,用tmux临时运行也没问题。当前Node.js版本为v18,已尝试升级Node.js、删除重装node_modules、卸载重装web3包、重启服务器,问题仍未解决。
解决方案
问题核心是systemd服务的环境变量与手动登录时的环境不一致,导致依赖解析、Node.js版本匹配出现异常。
1. 指定Node.js和npm的绝对路径
先手动执行which node和which npm获取绝对路径(比如/usr/local/bin/node、/usr/local/bin/npm),修改服务文件的ExecStart:
ExecStart=/usr/local/bin/npm run start
或者直接用node执行项目入口文件:
ExecStart=/usr/local/bin/node /home/projects/index.js
2. 继承用户环境变量
在Service段添加用户和环境配置,让服务使用和你手动登录时相同的环境:
[Service] User=你的登录用户名 WorkingDirectory=/home/projects Environment="PATH=/usr/local/bin:/usr/bin:/bin" ExecStart=/usr/local/bin/npm run start Restart=always
3. 检查web3版本兼容性
部分旧版web3可能不兼容Node.js v18的语法,尝试安装兼容版本:
npm install web3@^4.0.0
4. 排查环境差异
临时修改服务文件输出环境变量,对比手动运行的环境:
ExecStart=/bin/bash -c "env > /home/projects/service-env.log && npm run start"
启动服务后查看service-env.log,和手动执行env的输出对比,定位差异点。
内容的提问来源于stack exchange,提问作者badrone
相关产品推荐
相关产品推荐

