Node.js को एक पृष्ठभूमि प्रक्रिया के रूप में कैसे चलाया जाए और कभी न मरे?


480

मैं पोटीन एसएसएच के माध्यम से लिनक्स सर्वर से जुड़ता हूं। मैंने इसे इस तरह की पृष्ठभूमि प्रक्रिया के रूप में चलाने की कोशिश की:

$ node server.js &

हालांकि, 2.5 घंटे के बाद टर्मिनल निष्क्रिय हो जाता है और प्रक्रिया मर जाती है। वहाँ वैसे भी मैं टर्मिनल डिस्कनेक्ट के साथ भी इस प्रक्रिया को जीवित रख सकता हूं?


संपादित करें 1

दरअसल, मैंने कोशिश की nohup, लेकिन जैसे ही मैंने पुट्टी एसएसएच टर्मिनल को बंद किया या अपने इंटरनेट को अनप्लग किया, सर्वर प्रक्रिया तुरंत बंद हो गई।

क्या मुझे पुट्टी में कुछ करना है?


संपादित 2 (फरवरी, 2012 को)

एक node.jsमॉड्यूल है, हमेशा के लिए । यह डेमॉन सेवा के रूप में नोड.जेएस सर्वर चलाएगा।


7
जब मैं टर्मिनल से बाहर निकलता हूं तो मेरे मामले में nohup काम करता है exit। जब मैं सिर्फ पुट्टी विंडो बंद करता हूं तो यह विफल हो जाता है।
पावेल फुरमानीक

जवाबों:


513

सरल समाधान (यदि आप इस प्रक्रिया में वापस आने में रुचि नहीं रखते हैं, तो बस इसे चालू रखना चाहते हैं):

nohup node server.js &

jobsउन पृष्ठभूमि वाली प्रक्रियाओं की अनुक्रमित सूची देखने की भी आज्ञा है। और आप पृष्ठभूमि की प्रक्रिया को चलाकर kill %1या kill %2संख्या को प्रक्रिया के सूचकांक के साथ मार सकते हैं ।

शक्तिशाली समाधान (यदि यह इंटरैक्टिव है तो आपको इस प्रक्रिया को फिर से जोड़ने की अनुमति देता है):

screen

फिर आप Ctrl + a + d दबाकर अलग कर सकते हैं और फिर वापस चलकर संलग्न कर सकते हैं screen -r

स्क्रीन, tmux के नए विकल्प पर भी विचार करें।


1
तो, अगर मैं "स्क्रीन" चलाता हूं, तो मैं स्क्रीन बनाता हूं और इसके अंदर चलता हूं, है ना?
मुर्विनलाई

30
हां और फिर आप pressnig Ctrl + a, d और फिर स्क्रीन -r
MK

1
@murvinlai EC2 एक वातावरण है और इसका रूट विशेषाधिकार से कोई लेना-देना नहीं है। यह शायद आपके एएमआई के बारे में है। अमेज़न AMI के साथ उदाहरण के लिए आप निश्चित रूप से कर सकते हैं sudo bash
शुआयुआन

1
मैन बैश: यदि कंट्रोल ऑपरेटर द्वारा एक कमांड को समाप्त कर दिया जाता है, तो शेल एक उपधारा में पृष्ठभूमि में कमांड को निष्पादित करता है। शेल कॉम के खत्म होने का इंतजार नहीं करता है और वापसी की स्थिति 0.
एमके है।

34
कृपया, इसे पढ़ने वाले किसी को भी: स्क्रीन या tmux सत्र के अंदर एक नोड.जेएस सर्वर चलाना एक AMATEUR समाधान है! जब तक त्वरित परीक्षण के लिए मत करो। एक प्रक्रिया को चालू रखने के लिए आपको इसे निष्क्रिय करने की आवश्यकता है! इसके लिए उचित उपकरणों का उपयोग करें, जैसे कि हमेशा के लिए , pm2 या सादे पुराने init.d स्क्रिप्ट
विक्टर श्रोडर

1119

nohup node server.js > /dev/null 2>&1 &

  1. nohupका अर्थ है: जब स्टेंट कट जाए तब भी इस प्रक्रिया को समाप्त न करें।
  2. > /dev/nullका अर्थ है: stdout / dev / null पर जाता है (जो एक डमी डिवाइस है जो कोई आउटपुट रिकॉर्ड नहीं करता है)।
  3. 2>&1का अर्थ है: stderr भी stdout को जाता है (जो पहले से पुनर्निर्देशित है /dev/null)। आप त्रुटियों का एक लॉग रखने के लिए फ़ाइल पथ के साथ & 1 को बदल सकते हैं, जैसे:2>/tmp/myLog
  4. &अंत में इसका मतलब है: इस कमांड को बैकग्राउंड टास्क के रूप में चलाएं।

49
यह स्वीकृत उत्तर होना चाहिए, क्योंकि यह वर्तमान में स्वीकृत एक की तुलना में बहुत अधिक गुणवत्ता वाला है।
L0j1k

2
@ L0j1k डिबेटेबल, ओपी ने समझ के स्तर का प्रदर्शन किया है कि स्वीकृत उत्तर के लिए आगे स्पष्टीकरण की आवश्यकता है।
JFA

41
एसओ ओपी के बारे में उतना नहीं है जितना ओपी के सवालों के जवाब में आने वाले हजारों लोगों के बारे में है।
L0j1k

3
क्या stdout और stderr को पुनर्निर्देशित करना आवश्यक है? अगर मैं उन्हें बिल्कुल भी अनुप्रेषित नहीं करता तो क्या यह काम करता? या अगर मैं उन्हें फ़ाइलों के बजाय पुनर्निर्देशित करता हूं?
शॉन

10
Stdout और Stderr को भेजें /dev/null? अच्छा लॉगिंग ... सौभाग्य इस डिबग करने की कोशिश कर रहा है ...
विक्टर श्रोडर

138

आपको वास्तव में उपयोग करने का प्रयास करना चाहिए screen। यह सिर्फ करने से थोड़ा अधिक जटिल है nohup long_running &, लेकिन स्क्रीन को समझना एक बार जब आप फिर कभी वापस नहीं आते हैं।

पहले अपना स्क्रीन सत्र शुरू करें:

user@host:~$ screen

अपनी इच्छानुसार कुछ भी चलाएं:

wget http://mirror.yandex.ru/centos/4.6/isos/i386/CentOS-4.6-i386-binDVD.iso

Ctrl + A दबाएं और फिर d। किया हुआ। आपका सेशन बैकग्राउंड में चलता रहता है।

आप सभी सत्रों को सूचीबद्ध कर सकते हैं screen -ls, और कुछ को screen -r 20673.pts-0.srvकमांड द्वारा संलग्न कर सकते हैं , जहां 0673.pts-0.srv एक प्रविष्टि सूची है।


125

यह एक पुराना प्रश्न है, लेकिन Google पर इसे उच्च स्थान दिया गया है। मैं लगभग उच्चतम मत वाले उत्तरों पर विश्वास नहीं कर सकता, क्योंकि स्क्रीन सत्र के अंदर एक नोड.जेएस प्रक्रिया को चलाना, &या यहां तक ​​कि nohupध्वज के साथ - उनमें से सभी - बस वर्कआरा हैं।

विशेष रूप से स्क्रीन / tmux समाधान, जिसे वास्तव में एक शौकिया समाधान माना जाना चाहिए । स्क्रीन और Tmux प्रक्रियाओं को चालू रखने के लिए नहीं हैं, बल्कि टर्मिनल सत्रों के बहुसंकेतन के लिए हैं। यह ठीक है, जब आप अपने सर्वर पर एक स्क्रिप्ट चला रहे हैं और डिस्कनेक्ट करना चाहते हैं। लेकिन एक नोड.जेएस सर्वर के लिए आपकी प्रक्रिया एक टर्मिनल सत्र से जुड़ी नहीं होना चाहती है। यह बहुत नाजुक है। चीजों को चालू रखने के लिए आपको प्रक्रिया को निष्क्रिय करने की आवश्यकता है!

ऐसा करने के लिए बहुत सारे अच्छे उपकरण हैं।

PM2 : http://pm2.keymetrics.io/

# basic usage
$ npm install pm2 -g
$ pm2 start server.js

# you can even define how many processes you want in cluster mode:
$ pm2 start server.js -i 4

# you can start various processes, with complex startup settings
# using an ecosystem.json file (with env variables, custom args, etc):
$ pm2 start ecosystem.json

एक बड़ा फायदा जो मैं पीएम 2 के पक्ष में देखता हूं, वह यह है कि यह प्रक्रिया शुरू करने के लिए सिस्टम स्टार्टअप स्क्रिप्ट को फिर से शुरू करने के लिए बना सकता है:

$ pm2 startup [platform]

कहाँ platformहो सकता है ubuntu|centos|redhat|gentoo|systemd|darwin|amazon

हमेशा के लिए। js : https://github.com/foreverjs/forever

# basic usage
$ npm install forever -g
$ forever start app.js

# you can run from a json configuration as well, for
# more complex environments or multi-apps
$ forever start development.json

Init स्क्रिप्ट :

मैं एक init स्क्रिप्ट लिखने के बारे में विस्तार से नहीं जा रहा हूं, क्योंकि मैं इस विषय का विशेषज्ञ नहीं हूं और यह इस उत्तर के लिए बहुत लंबा होगा, लेकिन मूल रूप से वे सरल शेल स्क्रिप्ट हैं, जो ओएस घटनाओं द्वारा ट्रिगर किया गया है। आप इसके बारे में और अधिक यहाँ पढ़ सकते हैं

डॉकटर :

बस के साथ एक डोकर कंटेनर में अपने सर्वर चलाने -dविकल्प और, देखा , तो आप एक daemonized Node.js सर्वर है!

यहाँ एक नमूना Dockerfile (नोड से है। आधिकारिक गाइड ):

FROM node:argon

# Create app directory
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

# Install app dependencies
COPY package.json /usr/src/app/
RUN npm install

# Bundle app source
COPY . /usr/src/app

EXPOSE 8080
CMD [ "npm", "start" ]

फिर अपनी छवि बनाएं और अपना कंटेनर चलाएं:

$ docker build -t <your username>/node-web-app .
$ docker run -p 49160:8080 -d <your username>/node-web-app

आशा है कि यह किसी को इस पृष्ठ पर उतरने में मदद करेगा। हमेशा नौकरी के लिए उचित उपकरण का उपयोग करें। यह आपको बहुत सारे सिरदर्द और घंटे बचाएगी!


2
यह वही है जिसे मैं देख रहा था। Pm2 समाधान के साथ, क्या बाद में इसके साथ एक टर्मिनल संलग्न करने का एक तरीका है?
क्वांटमप्लांटेशन

4
@Quantumplation, नहीं। यह संभव नहीं है क्योंकि प्रक्रिया एक संवादात्मक सत्र में नहीं चल रही है। लेकिन आप उसी "भावना" tail -fको लॉग फ़ाइल से जोड़ सकते हैं जो pm2 उत्पन्न करती है।
विक्टर श्रोडर

1
आप उस screenसमाधान को निर्दिष्ट करते हैं जो बहुत से लोग पा रहे हैं कि काम एक वर्कअराउंड है। किसी विशिष्ट कार्य को प्राप्त करने के बहुत सारे तरीके हैं। मेरा मानना ​​है कि ऐसा होता है (विशिष्ट प्रश्न पर विचार करें) ऐसा run as background and never dieकई लोगों के लिए विशिष्ट कार्य को प्राप्त करने के लिए होता है । इसमें उपयोगकर्ता को फिर से बातचीत करने और यदि वह चाहें तो बदलाव करने की अनुमति देने का अतिरिक्त बोनस भी है। कुंजी घटक है backgroundऔर never die। सभी समाधानों में कुछ बोनस होते हैं।
LD जेम्स

@ रक्षित रवि - मैं असहमत हूँ। इन सभी को अतिरिक्त डाउनलोड / सॉफ्टवेयर / टूल की आवश्यकता होती है (init समाधान को छोड़कर, जिसमें कोई समाधान नहीं दिया गया था)। nohup है समाधान। यह लिनक्स में बेक किया गया है, और यह वही है जो इसके लिए है। यह एक पंक्ति है, यह साफ है, और यह अद्यतन के अनुसार, हर समय, इच्छित के अनुसार काम करता है। लोगों को वास्तव में इस तरह के बुनियादी उपयोग के मामलों के लिए तीसरे पक्ष के उपकरण का उपयोग करने से बचने की कोशिश करनी चाहिए। मतदाता उदाहरण (उदाहरण के लिए) शीर्ष मतदान के एक साधारण आदेश की तुलना में बहुत अधिक क्रियात्मक और संसाधन गहन है। डॉकटर से प्रेम करो, लेकिन इसके लिए नहीं।
जैक_हु

1
@ जैक_हु, मुझे ओवरहेड के बारे में कोई संदेह नहीं है, लेकिन nohupसमाधान "कभी नहीं मर" आवश्यकता को पूरा नहीं करता है। जब तक आप एक बहुत ही मुश्किल trapया हैप्पी अनंत लूप नहीं लिखते हैं , मैं यह नहीं देखता कि इस उद्देश्य के लिए विशेष रूप से लिखे गए टूल (या अपने द्वारा लिखी गई एक init स्क्रिप्ट) का उपयोग किए बिना प्रक्रिया को कैसे रखा जाए।
विक्टर श्रोडर

24

एक अन्य समाधान ने नौकरी को भंग कर दिया

$ nohup node server.js &
[1] 1711
$ disown -h %1

disown वही है जो मैं ढूंढ रहा था, लेकिन -h झंडा क्या करता है? मैं इसे मैनुअल में नहीं खोज सकता
रिमांतास जैकेविकियस

मैन पेज से: यदि -एच विकल्प दिया जाता है, तो प्रत्येक जॉबस्पेक को टेबल से हटाया नहीं जाता है, लेकिन इसे चिह्नित किया जाता है, ताकि शेल को राइट्स प्राप्त होने पर साइट पर नौकरी न भेजा जाए। यदि कोई जॉबस्पेक की आपूर्ति नहीं की जाती है, तो सभी विकल्पों को हटाने या चिह्नित करने के लिए -a विकल्प का अर्थ है;
myururdurmaz

14

nohupटर्मिनल के मरने के बाद भी कार्यक्रम को जारी रखने की अनुमति देगा। मेरे पास वास्तव में ऐसी परिस्थितियां हैं जहां nohupएसएसएच सत्र को सही ढंग से समाप्त करने से रोकता है, इसलिए आपको इनपुट को पुनर्निर्देशित करना चाहिए:

$ nohup node server.js </dev/null &

कैसे nohupकॉन्फ़िगर किया गया है, इसके आधार पर , आपको मानक आउटपुट और मानक त्रुटि को फ़ाइलों में रीडायरेक्ट करने की आवश्यकता हो सकती है।


7

मेरी योकाइ के उत्तर के आधार पर मेरी शेल आरसी फ़ाइल में यह फ़ंक्शन है:

nohup-template () {
    [[ "$1" = "" ]] && echo "Example usage:\nnohup-template urxvtd" && return 0
    nohup "$1" > /dev/null 2>&1 &
}

आप इसे इस तरह से उपयोग कर सकते हैं:

nohup-template "command you would execute here"

7

Nohup और स्क्रीन पृष्ठभूमि में Node.js को चलाने के लिए शानदार प्रकाश समाधान प्रदान करते हैं। Node.js प्रक्रिया प्रबंधक ( PM2 ) परिनियोजन के लिए एक उपयोगी उपकरण है। इसे अपने सिस्टम पर विश्व स्तर पर npm के साथ स्थापित करें:

npm install pm2 -g

डेमॉन के रूप में Node.js ऐप चलाने के लिए:

pm2 start app.js

आप वैकल्पिक रूप से इसे Keymetrics.io से जोड़ सकते हैं जो यूनिटेक द्वारा बनाई गई एक निगरानी SAAS है।


6
$ disown node server.js &

यह कमांड को सक्रिय कार्य सूची से हटा देगा और कमांड को पृष्ठभूमि में भेज देगा



3

Sysv init के साथ डेबियन पर सिस्टम सेवा के रूप में कमांड चलाने के लिए:

कंकाल स्क्रिप्ट की प्रतिलिपि बनाएँ और इसे अपनी आवश्यकताओं के लिए अनुकूलित करें, शायद आपको बस कुछ चर सेट करना है। /lib/init/init-d-scriptयदि आपकी कोई चीज़ आपकी ज़रूरतों पर खरी नहीं उतरती है तो आपकी लिपि को ठीक तरह से डिफॉल्ट का सामना करना पड़ेगा । यदि कुछ गलत होता है तो आप स्रोत में विवरण देख सकते हैं /lib/init/init-d-script। अनिवार्य संस्करण हैं DAEMONऔर NAME। स्क्रिप्ट start-stop-daemonआपके आदेश को चलाने के लिए उपयोग करेगी , START_ARGSआप उपयोग करने के लिए अतिरिक्त मापदंडों को परिभाषित कर सकते start-stop-daemonहैं।

cp /etc/init.d/skeleton /etc/init.d/myservice
chmod +x /etc/init.d/myservice
nano /etc/init.d/myservice

/etc/init.d/myservice start
/etc/init.d/myservice stop

यह है कि मैं अपने विकी विकी के लिए कुछ अजगर सामान कैसे चलाता हूं:

...
DESC="mediawiki articles converter"
DAEMON='/home/mss/pp/bin/nslave'
DAEMON_ARGS='--cachedir /home/mss/cache/'
NAME='nslave'
PIDFILE='/var/run/nslave.pid'
START_ARGS='--background --make-pidfile --remove-pidfile --chuid mss --chdir /home/mss/pp/bin'

export PATH="/home/mss/pp/bin:$PATH"

do_stop_cmd() {
    start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 \
        $STOP_ARGS \
        ${PIDFILE:+--pidfile ${PIDFILE}} --name $NAME
    RETVAL="$?"
    [ "$RETVAL" = 2 ] && return 2
    rm -f $PIDFILE
    return $RETVAL
}

वेराइटी सेट करने के अलावा मुझे do_stop_cmdअजगर को मारना पड़ा क्योंकि एग्जीक्यूटेबल को एब्जॉर्ब किया गया था , इसलिए सर्विस ठीक से बंद नहीं हुई।


3

ऊपर दिए गए शांत समाधानों के अलावा, मैं पर्यवेक्षक और मौन साधनों के बारे में भी उल्लेख करूँगा जो प्रक्रिया शुरू करने की अनुमति देते हैं, इसकी उपस्थिति की निगरानी करते हैं और अगर यह मर गया है तो इसे शुरू करें। 'मॉनीट' के साथ आप कुछ सक्रिय चेक भी चला सकते हैं जैसे कि चेक अगर http रिक्वेस्ट का जवाब देता है


3

Ubuntu के लिए मैं इस का उपयोग करें:

(निष्पादित PROG_SH और> / देव / अशक्त और)

सादर


छोटा बिंदु: यदि PROG_SH एक निष्पादन योग्य है, तो 'निष्पादन' की आवश्यकता नहीं है। डेविड द्वारा प्रस्तावित समाधान का उद्देश्य वर्तमान चल रहे खोल से बच्चे को अलग करना है। बच्चे के माता-पिता 'पीआईडी ​​1' बन जाते हैं और शेल के समाप्त होने पर प्रभावित नहीं होंगे।
सोलोपिलॉट

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