কীভাবে নোড.জেএসকে পটভূমি প্রক্রিয়া হিসাবে চালানো যায় এবং কখনই মারা যায় না?


480

আমি পুট্টি এসএসএইচ এর মাধ্যমে লিনাক্স সার্ভারে সংযুক্ত হয়েছি। আমি এটিকে ব্যাকগ্রাউন্ড প্রক্রিয়া হিসাবে চালানোর চেষ্টা করেছি:

$ node server.js &

যাইহোক, 2.5 ঘন্টা পরে টার্মিনাল নিষ্ক্রিয় হয়ে যায় এবং প্রক্রিয়াটি মারা যায়। টার্মিনাল সংযোগ বিচ্ছিন্ন হয়ে যাওয়ার পরেও কি আমি প্রক্রিয়াটি বাঁচিয়ে রাখতে পারি?


সম্পাদনা 1

আসলে, আমি চেষ্টা করেছি nohup, তবে আমি পুট্টি এসএসএইচ টার্মিনালটি বন্ধ করার সাথে সাথে বা আমার ইন্টারনেট আনপ্লাগ করার সাথে সাথে সার্ভার প্রক্রিয়াটি এখনই বন্ধ হয়ে যায়।

পুট্টিতে আমার কিছু করার আছে?


সম্পাদনা 2 (ফেব্রুয়ারী, 2012 এ)

চিরকালের জন্য একটি node.jsমডিউল আছে । এটি ডেমন পরিষেবা হিসাবে নোড.জেএস সার্ভার চালাবে।


7
আমার ক্ষেত্রে নোহুপ কাজ করে যখন আমি টাইপ করে টার্মিনাল থেকে প্রস্থান করি exit। আমি যখন পুট্টি উইন্ডোটি বন্ধ করি তখন এটি ব্যর্থ হয়।
পাভেল ফুরমানিয়াক

উত্তর:


513

সহজ সমাধান (আপনি যদি প্রক্রিয়াটিতে ফিরে আসতে আগ্রহী না হন তবে কেবল এটি চালিয়ে যেতে চান):

nohup node server.js &

এর রয়েছে jobsকমান্ড ঐ পশ্চাদপটে করা প্রসেস একজন সূচীবদ্ধ তালিকা দেখতে। এবং আপনি একটি পটভূমি প্রক্রিয়া চালিয়ে kill %1বা kill %2প্রক্রিয়াটির সূচক হিসাবে নম্বরটি দিয়ে হত্যা করতে পারেন ।

শক্তিশালী সমাধান (যদি এটি প্রক্রিয়াটি ইন্টারঅ্যাকটিভ হয় তবে আপনাকে পুনরায় সংযোগ করার অনুমতি দেয়):

screen

তারপরে আপনি Ctrl + a + d টিপে বিচ্ছিন্ন করতে পারেন এবং তারপরে দৌড়ে পিছনে সংযুক্ত করতে পারেন screen -r

এছাড়াও পর্দার নতুন বিকল্প বিবেচনা করুন, tmux।


1
সুতরাং, আমি যদি "স্ক্রিন" চালাই, আমি স্ক্রিনটি তৈরি করি এবং এর ভিতরে চলেছি, তাই না?
মুভিভিনলাই

30
হ্যাঁ এবং তারপরে আপনি প্রেসনিগ সিটিআরএল + এ, ডি দ্বারা বিচ্ছিন্ন করতে পারেন এবং তারপরে স্ক্রিন -আর
এমকে

1
@ মুরভিনলাই ইসি 2 একটি পরিবেশ এবং মূল সুবিধার সাথে এর কোনও যোগসূত্র নেই। এটি সম্ভবত আপনার এএমআই সম্পর্কে। উদাহরণস্বরূপ অ্যামাজন এএমআই সহ আপনি অবশ্যই পারেন sudo bash
শুইয়ুয়ান 11

1
man bash: কন্ট্রোল অপারেটর & এর মাধ্যমে যদি কোনও কমান্ড সমাপ্ত হয়, তবে শেলটি একটি সাব-শেলের পটভূমিতে কমান্ডটি কার্যকর করে। শেল কম-ম্যান্ড শেষ হওয়ার জন্য অপেক্ষা করে না, এবং ফেরতের স্থিতি 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অর্থ: স্ট্যাডার স্টাডাউটেও যায় (যা ইতিমধ্যে পুনঃনির্দেশিত /dev/null)। ত্রুটিযুক্ত লগ রাখার জন্য আপনি & 1 ফাইল ফাইলের সাথে প্রতিস্থাপন করতে পারেন, যেমন:2>/tmp/myLog
  4. &শেষের অর্থ: ব্যাকগ্রাউন্ড টাস্ক হিসাবে এই কমান্ডটি চালান।

49
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত, কারণ এটি বর্তমানে গৃহীত উত্তরটির চেয়ে অনেক বেশি মানের।
L0j1k

2
@ L0j1k বিতর্কিত, ওপি এমন একটি বোঝার স্তর দেখিয়েছে যে স্বীকৃত উত্তরের জন্য লিট আরও ব্যাখ্যা প্রয়োজন explanation
জেএফএ

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

এটি একটি পুরানো প্রশ্ন, তবে গুগলে উচ্চমানের। আমি প্রায় সর্বাধিক ভোট দেওয়া উত্তরগুলিতে বিশ্বাস করতে পারি না, কারণ পর্দার সেশনের অভ্যন্তরে একটি নোড.জেএস প্রক্রিয়া চালানো, &এমনকি nohupপতাকা সহ বা এমনকি - এগুলি সবই কেবল কর্মক্ষেত্র।

বিশেষত স্ক্রিন / টিএমউক্স সমাধান, যা সত্যই একটি অপেশাদার সমাধান হিসাবে বিবেচনা করা উচিত । স্ক্রিন এবং টিমাক্সগুলি প্রক্রিয়াগুলি চলমান রাখতে নয়, তবে একাধিকবার টার্মিনাল সেশনগুলির জন্য রয়েছে। এটি ঠিক আছে, যখন আপনি নিজের সার্ভারে একটি স্ক্রিপ্ট চালাচ্ছেন এবং সংযোগ বিচ্ছিন্ন করতে চান। তবে নোড.জেএস সার্ভারের জন্য আপনি চান না যে আপনার প্রক্রিয়াটি টার্মিনাল সেশনে সংযুক্ত থাকে। এটি খুব নাজুক। জিনিসগুলি চলমান রাখতে আপনাকে প্রক্রিয়াটি ডিমনাইজ করতে হবে!

এটি করার জন্য প্রচুর ভাল সরঞ্জাম রয়েছে।

পিএম 2 : http://pm2.keymetics.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

আর্ট স্ক্রিপ্ট :

আমি কীভাবে একটি এনআইপি স্ক্রিপ্ট লিখব সে সম্পর্কে বিস্তারিতভাবে যাচ্ছি না, কারণ আমি এই বিষয়ে বিশেষজ্ঞ নই এবং এই উত্তরের জন্য এটি খুব দীর্ঘ হবে না, তবে মূলত এগুলি সাধারণ শেল স্ক্রিপ্ট, ওএস ইভেন্টগুলির দ্বারা ট্রিগার করা। আপনি এই সম্পর্কে আরও পড়তে পারেন এখানে

ডকার :

-dঅপশন সহ একটি ডকারের ধারক মধ্যে আপনার সার্ভারটি চালান এবং, তবে , আপনার ডিমনাইজড নোড.জেএস সার্ভার রয়েছে!

এখানে একটি নমুনা ডকফাইফাইল (নোড.জেএস অফিশিয়াল গাইড থেকে ):

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
@ কোয়ান্টাম্পলেশন, না। প্রক্রিয়াটি ইন্টারেক্টিভ সেশনে চলছে না বলে এটি সম্ভব নয়। কিন্তু আপনার 2 tail -fপিএম 2 জেনারেট হওয়া লগ ফাইলটি আইংয়ের মাধ্যমে একই "অনুভূতি" থাকতে পারে।
ভিক্টর শ্রড্ডার

1
আপনি যে screenসমাধানটি সন্ধান করছেন তা সুনির্দিষ্টভাবে উল্লেখ করেছেন যে কাজটি একদম কাজ নয়। একটি নির্দিষ্ট কাজ অর্জনের প্রচুর উপায় রয়েছে। আমি বিশ্বাস করি যে এটি ঘটেছিল (নির্দিষ্ট প্রশ্নটি বিবেচনা করুন) এটি ঘটে যা run as background and never dieঅনেকের কাছেই সুনির্দিষ্টতার নির্দিষ্ট কাজটি অর্জন করে । এতে ব্যবহারকারীকে পুনরায় ইন্টারঅ্যাক্ট করতে এবং সে চাইলে পরিবর্তন আনতে অনুমতি দেওয়ার অতিরিক্ত বোনাস রয়েছে। মূলটি হল উপাদানগুলি backgroundএবং never die। সমস্ত সমাধানের নির্দিষ্ট বোনাস রয়েছে।
এলডি জেমস

@ রক্ষিত রবি - আমি একমত নই এগুলির জন্য অতিরিক্ত ডাউনলোড / সফ্টওয়্যার / সরঞ্জাম প্রয়োজন (আরআইডি সমাধান ব্যতীত, যার কোনও সমাধান দেওয়া হয়নি)। nohup হয় সমাধান। এটি লিনাক্সে বেকড এবং এটি এখানে রয়েছে। এটি এক লাইন, এটি পরিষ্কার এবং এটি আপডেট ব্যতিরেকে, প্রতিটি সময় মতো উদ্দেশ্য হিসাবে কাজ করে। লোকেরা সত্যিকারের যেমন মৌলিক ব্যবহারের ক্ষেত্রে তৃতীয় পক্ষের সরঞ্জামগুলি এড়ানোর চেষ্টা করা উচিত। ডকার উদাহরণ (উদাহরণস্বরূপ) শীর্ষ ভোট প্রাপ্ত উত্তরের একটি সাধারণ কমান্ডের চেয়ে অনেক বেশি ভার্বোস এবং সংস্থান নিবিড়। প্রেম ডকার, কিন্তু এই জন্য না।
জ্যাক_হু

1
@ জ্যাকহু, ওভারহেড সম্পর্কে আমার কোনও সন্দেহ নেই, তবে nohupসমাধানটি "কখনই মরে না" প্রয়োজনীয়তা পূরণ করে না। আপনি যদি খুব জটিল trapবা হ্যাকি অসীম লুপ না লিখে থাকেন তবে আমি দেখতে পাচ্ছি না যে এই উদ্দেশ্যে বিশেষভাবে লিখিত সরঞ্জামগুলি (বা অবশ্যই নিজের দ্বারা লিখিত একটি এনআর স্ক্রিপ্ট) ব্যবহার না করে কীভাবে প্রক্রিয়াটি ডিমনাইজড করা যায়।
ভিক্টর শ্রড্ডার

24

অন্য সমাধান কাজ অস্বীকার

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

অস্বীকার হ'ল আমি যা খুঁজছিলাম, কিন্তু -হ পতাকা কী করে? আমি ম্যানুয়ালে এটি খুঁজে পাচ্ছি না
রিমান্টাস জ্যাকাইকভিচিয়াস

ম্যান পৃষ্ঠা থেকে: যদি -h বিকল্পটি দেওয়া হয়, প্রতিটি জবস্পেকটি টেবিল থেকে সরিয়ে ফেলা হয় না, তবে চিহ্নিত করা হয় যাতে শেলটি যদি একটি SIGHUP পায় তবে SIGHUP কাজটিতে প্রেরণ করা হবে না। যদি কোনও জবস্পেক সরবরাহ না করা হয়, -এ বিকল্পের অর্থ সমস্ত কাজ সরিয়ে বা চিহ্নিত করা;
ময়ুরুরদুরমাজ

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

নোহুপ এবং স্ক্রিন পটভূমিতে নোড.জেএস চালানোর জন্য দুর্দান্ত হালকা সমাধান সরবরাহ করে। নোড.জেএস প্রসেস ম্যানেজার ( পিএম 2 ) মোতায়েনের জন্য একটি কার্যকর সরঞ্জাম। আপনার সিস্টেমে এটি বিশ্বজুড়ে এনপিএম সহ ইনস্টল করুন:

npm install pm2 -g

ডিমন হিসাবে একটি নোড.জেএস অ্যাপ্লিকেশন চালনা করতে:

pm2 start app.js

আপনি এটি বিকল্পভাবে কীমেট্রিক্সের সাথে লিঙ্ক করতে পারেন Unit ইউনিটেক দ্বারা নির্মিত একটি মনিটরিং এসএএস


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

উবুন্টুর জন্য আমি এটি ব্যবহার করি:

(নির্বাহী PROG_SH &> / দেব / নাল &)

শুভেচ্ছা


গৌণ পয়েন্ট: PROG_SH যদি একটি এক্সিকিউটেবল হয় তবে 'এক্সিকিউটিভ' দরকার হয় না। ডেভিড প্রস্তাবিত সমাধানের বিষয়টি হ'ল বর্তমান চলমান শেল থেকে শিশুকে আলাদা করা। সন্তানের পিতামাতারা 'পিড 1' হয়ে যায় এবং শেলটি শেষ হলে এটি প্রভাবিত হবে না।
একক পাইলট

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.