[英]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.