You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

命令行运行/usr/bin/npm start正常,systemctl启动服务遇内存错误

问题排查方案

核心差异定位

命令行直接启动正常,但systemd启动触发OOM,说明环境差异或systemd自身限制是关键,以下是针对性排查步骤:

1. 绕过npm直接启动node进程

npm start会启动子进程,可能导致NODE_OPTIONS未正确传递给node主进程。修改service文件的ExecStart:

[Service]
# 替换原ExecStart
ExecStart=/usr/bin/node index.js

重新加载并启动服务:

systemctl daemon-reload
systemctl restart serverjs.service

若问题解决,说明是npm启动流程的环境传递问题;若仍报错,继续下一步。

2. 检查systemd内存限制

systemd默认可能对服务设置内存上限,即使node配置了--max-old-space-size也会被systemd限制。在service文件中添加内存限制配置:

[Service]
# 根据实际需求设置,比如8GB
MemoryMax=8G
# 旧版systemd用MemoryLimit=8G

重新加载启动后观察是否恢复。

3. 对齐命令行与systemd的环境变量

命令行的环境变量(如HOME、NODE_ENV等)可能与systemd的默认环境不同,导致启动行为差异:

  • 先在命令行导出当前环境:
env > /root/service-env.txt
  • 修改service文件导入环境变量:
[Service]
EnvironmentFile=/root/service-env.txt

注意:若文件中有冲突变量(如PATH),可手动删除或调整,避免覆盖service中已配置的PATH。

4. 捕获更详细的错误日志

默认日志缺少栈信息,修改service开启完整日志输出:

[Service]
StandardOutput=journal+console
StandardError=journal+console

重启服务后,用以下命令查看完整日志:

journalctl -u serverjs.service -f

重点关注反序列化阶段的具体对象,定位是否是启动时加载的大文件/缓存导致内存溢出。

5. 验证工作目录与文件权限

虽然已设置WorkingDirectory=/root,但仍需确认index.js依赖的所有文件(如配置、缓存文件)的权限是否为root可访问,避免因文件无法读取导致异常内存分配。


内容的提问来源于stack exchange,提问作者OracleDBACurios

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 15:47:08