繁体   English   中英

无法找出我的服务有什么问题

[英]Cannot find out what's wrong with my service

我有一个小节点应用程序。 当我运行时它工作正常

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

仅在 Node 14 及更高版本中支持import语法(无实验标志)。 根据您打印的 node 和 npm 版本,您似乎确实使用 nvm 安装了 Node 14+。 但是,当您的服务运行时,会选择旧版本的 NodeJS。 很可能是您使用捆绑包管理器(apt?)安装的东西。

NVM 不会在标准 linux 二进制位置之一(/usr/bin 或 /usr/local/bin)中存储或链接节点二进制文件。 但是,它会在 .profile 或 .bashrc(基于您的终端)中添加一些脚本,以使用正确的 Node 二进制路径更新 PATH 环境变量。 通常:

export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm

现在,当您的服务执行时,systemd 必须按execStart运行您的execStart命令; 不加载 .profile / .bashrc 文件,无论从哪里执行 nvm 脚本。 如果您不打算经常更改节点的版本,则可以忘记 nvm,只需将服务中的 PATH 环境变量设置为终端中的当前 $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。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM