नोड.जेएस एप्लिकेशन को स्थायी रूप से कैसे चलाएं?


259

डेबियन सर्वर पर, मैंने Node.js. स्थापित किया मैं समझता हूँ कि इस कमांड लाइन के साथ पोटीन से ऐप कैसे लॉन्च करें:

node /srv/www/MyUserAccount/server/server.js

और इसे पते पर प्राप्त करें 50.51.52.53:8080(आईपी और पोर्ट)।

लेकिन जैसे ही मैं पोटीन को बंद करता हूं, तो मैं 50.51.52.53:8080अब पते पर नहीं पहुंच सकता।

Node.js एप्लिकेशन को स्थायी रूप से कैसे चलाया जाए?

जैसा कि आप अनुमान लगा सकते हैं, मैं लिनक्स और Node.js.


7
ध्यान दें कि PM2 के लिए एक अच्छा विकल्प है हमेशा के लिए , आप जो भी कारण के लिए हमेशा के लिए उपयोग करने के लिए नहीं करना चाहता था, तो।
केविन बी

धन्यवाद @KevinB github.com/Unitech/pm2 वास्तव में अच्छा विकल्प है
सचिन चव्हाण

जवाबों:


220

यद्यपि अन्य उत्तर ओपी की समस्या को हल करते हैं, वे सभी ओवरकिल हैं और यह नहीं समझाते हैं कि वह इस मुद्दे का अनुभव कर रहे हैं या नहीं।

कुंजी यह पंक्ति है, "मैं पोटीन को बंद करता हूं, फिर मैं पते तक नहीं पहुंच सकता"

जब आप पुट्टी पर अपने दूरस्थ होस्ट में लॉग इन होते हैं तो आपने एक SSH लिनक्स प्रक्रिया शुरू की है और उस SSH सत्र से टाइप किए गए सभी आदेशों को उक्त प्रक्रिया के बच्चों के रूप में निष्पादित किया जाएगा।

आपकी समस्या यह है कि जब आप पुट्टी को बंद करते हैं तो आप SSH सत्र से बाहर निकलते हैं जो उस प्रक्रिया और किसी भी सक्रिय बच्चे की प्रक्रिया को मारता है। जब आप पोटीन को बंद करते हैं तो आप अनजाने में अपने सर्वर को मार देते हैं क्योंकि आप इसे अग्रभूमि में चलाते हैं । इस व्यवहार से बचने के लिए पृष्ठभूमि में सर्वर को जोड़कर और अपने आदेश से चलाएं :

node /srv/www/MyUserAccount/server/server.js &

यहाँ समस्या लिनक्स ज्ञान की कमी है और नोड के बारे में सवाल नहीं है। कुछ और जानकारी के लिए देखें: http://linuxconfig.org/understanding-foreground-and-background-linux-processs

अपडेट करें:

जैसा कि दूसरों ने उल्लेख किया है, टर्मिनल से बाहर निकलने पर नोड सर्वर अभी भी मर सकता है। एक सामान्य गोटा जो मुझे आया है, वह यह है कि भले ही नोड प्रक्रिया bg में चल रही हो, यह stdout है और stderr अभी भी टर्मिनल पर बताया गया है। इसका मतलब यह है कि यदि नोड सर्वर कंसोल.लॉग या कंसोल को लिखता है। यह एक टूटी हुई पाइप त्रुटि और क्रैश प्राप्त करेगा। आपकी प्रक्रिया के आउटपुट को पाइप करके इससे बचा जा सकता है:

node /srv/www/MyUserAccount/server/server.js > stdout.txt 2> stderr.txt &

यदि समस्या बनी रहती है, तो आपको tmux या nohup जैसी चीजों पर ध्यान देना चाहिए , जो अभी भी नोड विशिष्ट समाधानों की तुलना में अधिक मजबूत हैं, क्योंकि उनका उपयोग सभी प्रकार की प्रक्रियाओं (डेटाबेस, लॉगिंग सेवाओं, अन्य भाषाओं) को चलाने के लिए किया जा सकता है।

एक सामान्य गलती जो सर्वर को बाहर निकलने का कारण बन सकती है वह यह है कि दौड़ने के बाद nohup node your_path/server.js &आप बस एक साधारण क्लिक करके पुट्टी टर्मिनल को बंद कर दें। आपको exitइसके बजाय कमांड का उपयोग करना चाहिए , फिर आपका नोड सर्वर ऊपर और चल रहा होगा।


7
यदि आप अभी भी &सेवा करते समय पुट्टी सत्र को बंद कर देते हैं , तब भी सेवा बंद हो जाती है। (बस डेबियन जेसी पर परीक्षण किया गया)
नीके न्यूमैन

1
जैसा कि @NiCkNewman ने कहा, यह जवाब अधूरा है! सही समाधान के लिए रिक रॉय का जवाब देखें ।
thejonwithnoh

19
"&" प्रक्रिया को पृष्ठभूमि में चलाता है, लेकिन आपको वास्तव में कंसोल विंडो से अलग करने के लिए इस कमांड की शुरुआत में "nohup" जोड़ने की आवश्यकता होगी ताकि जब कुछ देर बाद खिड़की सो जाए तो एप्लिकेशन बंद न हो। घंटे, पूर्व में बताई गई कमांड को संशोधित करना:nohup node /srv/www/MyUserAccount/server/server.js &
सिरोज

2
AIX पॉवर सिस्टम, nohup node myApp.js &एप्लिकेशन को bg में चलाता है लेकिन यह शब्द बंद हो जाने पर मर जाता है। हालांकि यकीन नहीं हो रहा है।
अनीब

4
@Nnjawn, आपको exitटर्मिनल से बाहर निकलने के लिए कमांड का उपयोग करना होगा।
आयनॉट नेचुला

342

आप इस तरह npm का उपयोग करके हमेशा के लिए स्थापित कर सकते हैं :

sudo npm install -g forever

और उसके बाद अपना आवेदन शुरू करें:

forever server.js

या सेवा के रूप में:

forever start server.js

जब यह दुर्घटनाग्रस्त हो जाता है या किसी कारण से रुक जाता है तो हमेशा के लिए आपके ऐप को फिर से चालू कर देता है। पुनरारंभ करने के लिए 5 को आप उपयोग कर सकते हैं:

forever -m5 server.js

सभी चल रही प्रक्रियाओं को सूचीबद्ध करने के लिए:

forever list

कोष्ठक में पूर्णांक को नोट करें और एक प्रक्रिया को रोकने के लिए निम्नानुसार उपयोग करें:

forever stop 0

एक चालू प्रक्रिया को फिर से शुरू करना:

forever restart 0

यदि आप अपनी एप्लिकेशन फ़ाइल पर काम कर रहे हैं, तो -wजब भी आपकी server.jsफ़ाइल बदलती है , तो आप स्वचालित रूप से पुनरारंभ करने के लिए पैरामीटर का उपयोग कर सकते हैं :

forever -w server.js

11
@MarthaJames अगर इसका समापन जब आपका ssh सत्र / विंडो बंद हो जाता है, तो आप संभवतः "प्रारंभ" को शामिल करना भूल जाते हैंforever start <file>
क्रिस्टियन

8
उपयोग करने forever server.jsऔर के बीच क्या अंतर है forever start server.js? मुझे पता है कि यह "सेवा के रूप में" कहती है लेकिन इसका क्या मतलब है?
Marquizzo

5
जब मैं टाइप करता हूं forever server.js, तो यह सर्वर शुरू करता है। अगर मैं Ctrl+ दबाता हूं C, तो यह सेवा बंद कर देता है। अगर मैं में टाइप forever start server.jsतो यह सेवा शुरू होता है और यहां तक कि अगर मैं प्रेस Ctrl+ Cयह खुला रहता है। फिर आप सूची को रोकने / देखने के लिए ऊपर अन्य संदर्भित कमांड कर सकते हैं। यही मैंने कम से कम अनुभव किया।
टर्मिऑन

6
क्या सर्वर के पुनरारंभ होने के बाद यह स्क्रिप्ट शुरू होती है?
नोवेल

1
foreverमॉड्यूल (v0.15.3) सेवा हमलों की नियमित अभिव्यक्ति डेनियल की चपेट में है और नहीं किया जाना चाहिए: github.com/foreverjs/forever/issues/960
बेनी न्यूगेबार

82

आप PM2 का उपयोग कर सकते हैं , यह Node.js अनुप्रयोगों के लिए एक अंतर्निहित लोड बैलेंसर के साथ उत्पादन प्रक्रिया प्रबंधक है।

PM2 स्थापित करें

$ npm install pm2 -g

एक आवेदन शुरू करो

$ pm2 start app.js

अगर आप एक्सप्रेस का इस्तेमाल कर रहे हैं तो आप अपना ऐप जैसे शुरू कर सकते हैं

pm2 start ./bin/www --name="app"

सभी चल रही प्रक्रियाओं को सूचीबद्ध करना:

$ pm2 list

यह सभी प्रक्रिया को सूचीबद्ध करेगा। फिर आप निम्नलिखित आदेश के साथ आईडी या ऐप के नाम का उपयोग करके अपनी सेवा को रोक / पुनः आरंभ कर सकते हैं।

$ pm2 stop all                  
$ pm2 stop 0                    
$ pm2 restart all               

लॉग प्रदर्शित करने के लिए

$ pm2 logs ['all'|app_name|app_id]

1
भगवान आपका भला करे! यह काम करता हैं!! फॉरएवर और नोहुप amazon वेब सेवा बिटनामी नोडज सर्वर ( docs.bitnami.com/aws/infrastructure/nodejs ) पर काम करते हैं । PM2 बढ़िया काम करता है!
पोलास

लगता है कि इस लाइब्रेरी की सबसे अधिक संख्या
जीथब

41

मैं एक दुर्घटना की स्थिति में नोड को फिर से शुरू करने के लिए फॉरएवर जैसे कुछ की तलाश करने की सलाह दूंगा, और आपके लिए इसे निष्क्रिय करने का काम करूंगा।


मैं यह बताना चाहता हूं कि nohupयदि आप ssh सत्र से बाहर निकलते हैं तो बिना नोड से बाहर निकलेंगे, यदि आप इसे इस तरह से चलाते हैं (जब तक कि आप स्क्रीन से tmux जैसी किसी चीज का उपयोग नहीं कर रहे हैं)।
हाओहजुन

1
@ हौजुन, दिलचस्प, लेकिन यह नहीं है कि यह कैसे मेरे लिए मेरी मशीनों पर काम कर रहा है। जब मैं इस कमांड का उपयोग करके कुछ शुरू करता हूं, तो यह SSH सत्र को बंद करने के बाद भी पृष्ठभूमि में हमेशा के लिए चलता है।
ब्राड

@ ब्रैड कृपया stackoverflow.com/questions/4018154/… पर दूसरा उत्तर देखें । ऐसा प्रतीत होता है कि कुछ लोग उस प्रश्न की पहली टिप्पणी से सहमत हैं जो बताते हैं nohup। यह बहुत अच्छा होगा यदि हम इस भ्रम को हल कर सकते हैं। लेकिन मुझे नहीं पता कि कहां से शुरू किया जाए।
हाओहुन

4
अधिकांश यूनिक्स के लिए (लिनक्स के अधिकांश डिस्ट्रोस सहित), पृष्ठभूमि में चलने वाली चीजें अभी भी प्रक्रिया को मार देंगी यदि आप टर्मिनल विंडो को बंद करते हैं। इसे रोकने के लिए इसे चलाएं nohup। उदाहरण:nohup node app.js &
बेपनाह

1
मैं हमेशा के लिए एक उत्पादन लिनक्स एनवी के साथ उपयोग करता हूं। मैं आमतौर पर कमांड को हमेशा के लिए शुरू करने का उपयोग करता हूं --minUptime 10000 -o /logs/myapp.log nodeApp.js
mbokil

36

यदि आप हमेशा टर्मिनल में अपना नोड ऐप चलाना चाहते हैं, तो बस स्क्रीन का उपयोग करें।

Ubuntu / debian पर स्थापित करें:

sudo apt-get install screen

उपयोग:

$ screen
$ node /path/to/app.js

ctrl + aऔर फिर ctrl + dखारिज करने के लिए

वापस पाने के लिए:

एक स्क्रीन: screen -r

यदि एक से अधिक हैं तो आप सभी स्क्रीन को सूचीबद्ध कर सकते हैं: screen -ls

और तब: screen -r pid_number


1
यह एक अच्छा विकल्प है क्योंकि यह मुझे किसी भी समय अग्रभूमि में स्विच करने की अनुमति देता है
aexl

26

आप बस इसका इस्तेमाल कर सकते हैं

nohup node /srv/www/MyUserAccount/server/server.js &

यह एप्लिकेशन को चालू रखेगा और इसे बंद करने के लिए आपको इसे मारना होगा।

उसके लिए आप इंस्टॉल कर सकते हैं htopऔर फिर नोड खोज सकते हैं और फिर इसे मार सकते हैं


18
यह ध्यान रखना महत्वपूर्ण है कि इस मामले में, उपयोगकर्ता को सही तरीके से PuTTY सत्र से बाहर निकलने की आवश्यकता होगी (यानी exitकमांड के माध्यम से )। यदि उपयोगकर्ता बस खिड़की बंद कर देता है, तो यह SIGHUPप्रक्रिया को समाप्त करने के अलावा किसी अन्य सिग्नल का उपयोग कर सकता है, और इसलिए नोड वैसे भी बंद हो जाएगा।
thejonwithnoh

1
हालांकि समस्या के लिए एक सरल सभी उद्देश्य लिनक्स समाधान होने के लिए। यह डॉग निबलर के जवाब से बेहतर है ।
thejonwithnoh

@Thejonwithnoh आपकी टिप्पणी को पढ़ने के बाद मैंने अचानक से पोटीन को बंद करने की कोशिश की है, लेकिन सर्वर ने अभी भी काम किया है, शायद यह करना था कि एनवी को कैसे कॉन्फ़िगर किया गया था। लेकिन मुझे लगा कि ओपी जो पूछ रहा था, उसे हासिल करने का यह सबसे सरल तरीका होगा
रिक रॉय

मुझे यह सरल दृष्टिकोण पसंद है, यह वह है जिसका मैं उपयोग कर रहा हूं, क्योंकि इसे मारने के लिए, सबसे आसान सिर्फ एक है killall node, जो सभी नोड प्रक्रियाओं को मार देगा, मेरे मामले में केवल एक।
नेल्सन

@ नेल्सन जो सभी नोड प्रक्रियाओं को मार देगा, यदि आपके पास कई स्क्रिप्ट चल रही हैं और केवल एक विशिष्ट को समाप्त करना चाहते हैं, तो मैं आपको इस प्रक्रिया को खोजने का सुझाव दूंगा और फिर उस विशेष को समाप्त कर सकता हूं जब आपके पास एक उत्पादन सर्वर में कई नोड प्रक्रियाएं चल रही थीं। और एक दुःस्वप्न में आने का मन नहीं करना चाहता: डी
रिक रॉय

12

हमेशा के लिए ऐसा करने के लिए एक बहुत अच्छा NodeJs मॉड्यूल है।

foreverकमांड लाइन में टाइप करके इंस्टॉल करें

$ npm install forever -g

फिर नोड.जेएस स्क्रिप्ट को चलाने के लिए निम्न कमांड का उपयोग करें

$ forever start /path/to/script.js

तुम तैयार हो। इसके अतिरिक्त आप चला सकते हैं

$ forever list

सभी चालू स्क्रिप्ट देखने के लिए। आप टाइप करके किसी विशिष्ट स्क्रिप्ट को समाप्त कर सकते हैं

$ forever stop [pid]

[pid]स्क्रिप्ट की प्रक्रिया आईडी कहाँ है जो आप listकमांड से प्राप्त करेंगे । सभी लिपियों को रोकने के लिए, आप टाइप कर सकते हैं

$ forever stopall

10

AWS Ubunto vm में nohup काम करने की जाँच मैंने सही की हैsyntax

ubuntu@ip-172-00-00-00:~/ms$ nohup node server.js &

फिर एंटर दबाएं आपको यह लाइन दिखाई देगी

ubuntu@ip-172-00-00-00:~/ms$ nohup: ignoring input and appending output to nohup.out

फिर इसे टाइप करें

rm nohup.out

यहां छवि विवरण दर्ज करें


3
मुझे पसंद है कि आपने छोटे बैश प्रॉम्प्ट में होस्टनाम को कैसे खाली किया, लेकिन इसे खिड़की के बड़े शीर्षक में छोड़ दिया
Cony

10

स्थापना

$ [sudo] npm install forever -g

लगातार स्क्रिप्ट चलाने के लिए आप हमेशा के लिए उपयोग कर सकते हैं

forever start server.js

forever list

रोक सेवा के लिए

forever stop server.js

9

यहाँ मैं अपने व्यक्तिगत परियोजनाओं के लिए उपयोग कर रहा है एक upstart समाधान है:

इसे इसमें रखें /etc/init/node_app_daemon.conf:

description "Node.js Daemon"
author      "Adam Eberlin"

stop on shutdown

respawn
respawn limit 3 15

script
  export APP_HOME="/srv/www/MyUserAccount/server"
  cd $APP_HOME
  exec sudo -u user /usr/bin/node server.js
end script

यह उस स्थिति में आपके एप्लिकेशन को रिहा करने में भी सक्षम होगा जो इसे क्रैश करता है। यदि यह 15 सेकंड से कम समय में 3 या अधिक बार दुर्घटनाग्रस्त हो जाता है तो यह आपके एप्लिकेशन को प्रतिक्रिया देने का प्रयास करेगा।


9

विकास के दौरान, मैं नोडमॉन का उपयोग करने की सलाह देता हूं । जब भी कोई फ़ाइल बदलेगा यह आपके सर्वर को पुनः आरंभ करेगा। जैसा कि दूसरों ने बताया है, फॉरएवर एक विकल्प है, लेकिन उत्पादन में, यह सब उस प्लेटफॉर्म पर निर्भर करता है जिसका आप उपयोग कर रहे हैं। आप आमतौर पर सेवाओं को बनाए रखने के लिए ऑपरेटिंग सिस्टम के अनुशंसित तरीके का उपयोग करना चाहेंगे (जैसे http://www.freedesktop.org/wiki/Software/systemd/ )।


यह मेरे लिए एक MEAN.JS एप्लिकेशन पर काम करता है - nodemonजब तक कि आप सर्वर JS फाइल को निर्दिष्ट नहीं करते हैं, तब तक ग्रंट कमांड चलाता है, इसलिए मैं इसे मूंगो और नोड को हमेशा के लिए / एक साथ चलाने के लिए उपयोग कर रहा हूं
J-Dizzle

8

मैंने हमेशा के लिए काम को पूरी तरह से ठीक करने के लिए पाया है।

मान लें कि आपके पास पहले से ही npm स्थापित है, यदि नहीं, तो बस करो

sudo apt-get install npm

फिर हमेशा के लिए स्थापित करें

npm install forever --global

अब आप इसे इस तरह चला सकते हैं

forever start app.js

https://codingweb.io/run-nodejs-application-background/


npm rm -g हमेशा के लिए इसे हटाने के लिए
ड्रैगनफायर


5

दूसरा तरीका आपके ऐप के लिए एक सिस्टम यूनिट बना रहा है। इसके समान "/ etc / systemd / system" फ़ोल्डर में "XXX.service" फ़ाइल बनाएँ:

[Unit]
Description=swagger
After=network.target

[Service]
ExecStart=/usr/bin/http-server /home/swagger/swagger-editor &
WorkingDirectory=/home/swagger
Restart=always
RestartSec=30

[Install]
WantedBy=multi-user.target

एक लाभ यह है कि ऐप एक सेवा के रूप में चलेगा, यदि यह दुर्घटनाग्रस्त हो जाता है तो यह स्वचालित रूप से पुनरारंभ हो जाता है।

आप इसे प्रबंधित करने के लिए sytemctl का उपयोग भी कर सकते हैं:

systemctl start XXXसेवा शुरू करने के लिए, systemctl stop XXXइसे रोकने के systemctl enable XXXलिए और सिस्टम बूट होने पर ऐप को स्वचालित रूप से शुरू करने के लिए।


4

उम्मीद है इससे आपको मदद मिलेगी।

कमांड लाइन पर, हमेशा के लिए स्थापित करें:

npm install forever -g

एक उदाहरण फ़ाइल बनाएँ:

sudo nano server.js 

आप फ़ाइल को संपादित कर सकते हैं और सीधे अपने ब्राउज़र में परिणाम प्राप्त कर सकते हैं।
फ़ाइल को संपादित करने के लिए आप फ़ाइलज़िला या किसी संपादक का उपयोग कर सकते हैं। फ़ाइल चलाने के लिए यह कमांड चलाएँ:

forever start --minUptime 1 --spinSleepTime 1000 -w server.js

यहां छवि विवरण दर्ज करें


2

मैं PM2 के उपयोग की सलाह देता हूं, जो कि Node.js अनुप्रयोगों के लिए एक प्रक्रिया प्रबंधक है। PM2 अनुप्रयोगों को प्रबंधित करने और उन्हें निष्क्रिय करने (उन्हें सेवा के रूप में चलाने) का एक आसान तरीका प्रदान करता है।

इस लिंक को देखें - https://www.digitalocean.com/community/tutorials/how-to-set-up-a-node-js-application-for-production-on-centos-7


1
पहले से ही PM2 की सिफारिश करने वाला एक उत्तर है। stackoverflow.com/a/40254977/390718
हॉपिया

2

किसी अन्य पैकेज को स्थापित करने की आवश्यकता नहीं है।

यह आदेश चलाएँ

node server.js > stdout.txt 2> stderr.txt &

server.js आपकी सर्वर फ़ाइल है या यह api.js हो सकती है

उसके बाद टर्मिनल बंद करने के लिए " बाहर निकलें " मारा

exit

0

हमेशा के लिए पैकेज ने मेरे लिए काम किया, सिर्फ एक चीज, यह गहरे-बराबर पर निर्भर करता है , इसलिए यदि आपने इसे स्थापित करने के साथ समस्या की है:

npm -g install forever

प्रयत्न:

npm -g install forever deep-equal@1.1.1

बजाय।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.