如何解决无法找出我的服务出了什么问题
我有一个小节点应用程序。 我跑步时效果很好
pi@rpb:/opt/linear-actuator $ /home/pi/.nvm/versions/node/v14.8.0/bin/npm start
我创建了一项服务以确保其在启动时自动启动。
[Unit]
Description=LinearActuator
After=network.target
[Service]
WorkingDirectory=/opt/linear-actuator
ExecStart=/home/pi/.nvm/versions/node/v14.8.0/bin/npm start
Restart=always
User=pi
Environment=PORT=8081
[Install]
WantedBy=multi-user.target
但是我的服务无法启动(我之前已启用它)。 journalctl说
août 27 21:37:16 rpb npm[1913]: > linearactuator@1.0.0 start /opt/linear-actuator
août 27 21:37:16 rpb npm[1913]: > node server.js
août 27 21:37:18 rpb npm[1913]: /opt/linear-actuator/server.js:4
août 27 21:37:18 rpb npm[1913]: import express from 'express';
août 27 21:37:18 rpb npm[1913]: ^^^^^^
août 27 21:37:18 rpb npm[1913]: SyntaxError: Unexpected token import
使用旧版本的节点运行应用程序时出现此错误。但是在我的服务中使用的绝对路径很好。
pi@rpb:/opt/linear-actuator $ which node
/home/pi/.nvm/versions/node/v14.8.0/bin/node
pi@rpb:/opt/linear-actuator $ node -v
v14.8.0
pi@rpb:/opt/linear-actuator $ which npm
/home/pi/.nvm/versions/node/v14.8.0/bin/npm
pi@rpb:/opt/linear-actuator $ npm -v
6.14.7
任何关于我所缺少的东西的照明? :)
解决方法
import
语法仅对模块有效。您应该将文件从server.js
重命名为server.mjs
。
{14}仅在节点14之后才支持import
语法。根据您的节点和打印的npm版本,似乎确实使用nvm安装了Node 14+。但是,当您运行服务时,将拾取旧版本的NodeJS。很有可能是您使用捆绑的软件包管理器(apt?)安装的。
NVM不在标准Linux二进制位置之一(/ usr / bin或/ usr / local / bin)中存储或链接节点二进制文件。但是,它在.profile或.bashrc中添加了一些脚本(基于您的终端),以使用正确的Node二进制路径更新PATH env var。通常:
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
现在,当执行服务时,systemd必须按原样运行execStart
命令;无论从哪里执行nvm脚本,都无需加载.profile / .bashrc文件。如果您不打算经常更改节点的版本,则可能会忘记nvm,而只需将服务中的PATH env var设置为来自终端的当前$ PATH即可。只需运行echo $PATH
,选择结果并粘贴在下面的占位符中即可。
[Unit]
Description=LinearActuator
After=network.target
[Service]
WorkingDirectory=/opt/linear-actuator
ExecStart=/home/pi/.nvm/versions/node/v14.8.0/bin/npm start
Restart=always
User=pi
Environment=PORT=8081
Environment=PATH=<Put the result of `echo $PATH` here>
[Install]
WantedBy=multi-user.target
更好的方法是在“启动命令”中容纳nvm。基本上创建一个新的start-my-server.sh
文件,使make可执行并添加一系列类似以下的命令(更改路径以适合您的设置):
#!/bin/bash
[ -s "/home/pi/.nvm/nvm.sh" ] && \. "/home/pi/.nvm/nvm.sh"
cd /opt/linear-actuator
npm start
然后,将服务中的execStart指向此新创建的Shell脚本,而不是直接运行npm start。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。