簡體   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