Score:0

`nohup: ไม่สามารถเรียกใช้คำสั่ง 'node': ไม่มีไฟล์หรือไดเร็กทอรีดังกล่าว' เมื่อรันสคริปต์ผ่าน ssh

ธง fr

ฉันมีเซิร์ฟเวอร์ระยะไกลที่ฉันให้บริการเว็บเซิร์ฟเวอร์โดยใช้โหนด (ด่วน) และ nginx ฉันมี ./devops/deploy.sh สคริปต์ที่เริ่มต้นเว็บเซิร์ฟเวอร์และรีสตาร์ท nginx สคริปต์ดังกล่าวทำงานได้อย่างถูกต้องหากฉันเชื่อมต่อกับอินสแตนซ์ด้วยตนเอง (ssh <ผู้ใช้>@<ip>) แล้วเรียกใช้

cd my-repo
คอมไพล์ดึง
./devops/deploy.sh

ฉันไม่สามารถตั้งค่าสคริปต์ที่ทำให้สิ่งนี้เป็นไปโดยอัตโนมัติได้ ฉันลองกับสคริปต์นี้

#!/bin/bash
ตั้ง -euo ไปป์ไลน์

การใช้งาน () {
  แมว << EOF
การใช้งาน: ./devops/update-instance.sh <user@ip>
อฟ
  ทางออก -1
}

CONNECTION_STRING=${1:-""}

ถ้า [ -z $CONNECTION_STRING ]; แล้ว
  การใช้งาน
ไฟ

ssh -t $CONNECTION_STRING << EOF
cd my-repo
คอมไพล์ดึง
./devops/deploy.sh
อฟ

แต่มันทำให้ฉัน nohup: ไม่สามารถเรียกใช้คำสั่ง 'โหนด': ไม่มีไฟล์หรือไดเร็กทอรีดังกล่าว. นี่คือสคริปต์การปรับใช้ที่ฉันเรียกใช้ในเครื่องจากเครื่องของฉัน

#!/bin/bash
ตั้ง -euo ไปป์ไลน์

lsof -ti:3000 && ฆ่า $(lsof -ti:3000)
แถบเสียงสะท้อน
เสียงสะท้อน $ (โหนด -v)
nohup โหนด Runner.js &

NGINX_CONFIG_PATH=/etc/nginx/sites-enabled/my-repo
rm -rf $NGINX_CONFIG_PATH
cp devops/nginx-config $NGINX_CONFIG_PATH
nginx -t
nginx -s โหลดซ้ำ

โหนดรันเนอร์.js เพียงแค่เริ่มแอปด่วน ดังนั้นจึงไม่มีอะไรแปลกที่นั่น

สิ่งที่ฉันต้องการบรรลุนั้นคล้ายกับโพสต์อื่นนี้มาก https://askubuntu.com/questions/349262/run-a-nohup-command-over-ssh-then-disconnect แต่ไม่มีการกล่าวถึงข้อผิดพลาด nohup + node นี้
หลังจากดูแล้ว ฉันรู้ว่าฉันอาจทำบางอย่างผิดพลาดในการเรียกสคริปต์การปรับใช้ แต่ฉันไม่เข้าใจจริงๆ ว่ามันคืออะไร ในสคริปต์อัปเดตฉันพยายามทำ nohup ./devops/deploy.sh & แทนที่จะเป็นเพียงแค่ ./devops/deploy.sh แต่ได้เหมือนกัน nohup: ไม่สามารถเรียกใช้คำสั่ง 'โหนด': ไม่มีไฟล์หรือไดเร็กทอรีดังกล่าว ข้อผิดพลาด.
ถ้าฉันใส่เนื้อหาของ ./devops/deploy.sh สคริปต์ภายใน ssh ... << EOF <เนื้อหาที่นี่> EOF ฉันก็ได้รับเช่นเดียวกัน nohup: ไม่สามารถเรียกใช้คำสั่ง 'โหนด': ไม่มีไฟล์หรือไดเร็กทอรีดังกล่าว ข้อผิดพลาด


เปลี่ยนคำสั่ง ssh เป็น

ส่งออก NVM_DIR="\$HOME/.nvm"
\. "\$NVM_DIR/nvm.sh"
\. "\$NVM_DIR/bash_completion"
cd my-repo
คอมไพล์ดึง
nohup ./devops/deploy.sh 1>api.stdout 2>api.stderr &
Score:1
ธง bd

เรียกใช้ไฟล์ปฏิบัติการ (ในกรณีนี้ โหนด) เพียงแค่ตั้งชื่อโดยไม่มีพาธ กำหนดให้ไฟล์อยู่ในไดเร็กทอรีใดไดเร็กทอรีที่ระบุในตัวแปรสภาพแวดล้อม เส้นทาง. เนื้อหาที่แน่นอนของตัวแปรนั้นมีแนวโน้มที่จะแตกต่างกันไปตามวิธีการเรียกใช้เชลล์ เช่น การเข้าสู่ระบบแบบโต้ตอบหรือการเริ่มต้นสคริปต์ ของคุณ โหนด ปฏิบัติการอาจอยู่ในไดเร็กทอรีที่อยู่ในรายการ เส้นทาง เมื่อคุณเข้าสู่ระบบแบบโต้ตอบ แต่ไม่ใช่เมื่อคุณเรียกใช้สคริปต์ของคุณ

โดยทั่วไปมีสองวิธีในการแก้ปัญหานี้:

  1. ตั้ง เส้นทาง อย่างชัดเจนที่จุดเริ่มต้นของสคริปต์ของคุณเพื่อรวมไดเร็กทอรีทั้งหมดที่สคริปต์ตั้งใจจะเรียกใช้ไฟล์ปฏิบัติการ อย่าลืมที่จะรวม /ถังขยะ และ /usr/bin เพราะนั่นคือที่ที่คำสั่งมาตรฐานอยู่ ตัวอย่างเช่น หากคุณ โหนด ปฏิบัติการอยู่ใน /opt/MyPrettyDevops/binคุณจะเพิ่มบรรทัด

    ส่งออก PATH=/bin:/usr/bin:/opt/MyPrettyDevops/bin
    
  2. ระบุเส้นทางไปยัง โหนด ปฏิบัติการได้อย่างชัดเจน โดยเปลี่ยน ไม่อัพ สายไป

    nohup /opt/MyPrettyDevops/bin/node Runner.js &
    
ffigari avatar
fr flag
นั่นคือฉันกำลังจัดการโหนดผ่าน nvm และดูเหมือนว่าการเข้าสู่ระบบผ่าน ssh จะโหลดโปรไฟล์ bash ซึ่งจะโหลด nvm และโหนด ต้องโหลด nvm และโหนดด้วยตนเองในสคริปต์ ฉันต้องทำตามคำแนะนำ stdout / stdin เพื่อให้การโทร ssh เสร็จสิ้น

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา