Node.js'yi arka plan işlemi olarak çalıştırmak ve asla ölmek nasıl?


480

Linux sunucusuna macun SSH ile bağlandım. Ben böyle bir arka plan işlemi olarak çalıştırmak için çalıştı:

$ node server.js &

Ancak, 2.5 saat sonra terminal devre dışı kalır ve işlem ölür. Terminalin bağlantısı kesilmiş olsa bile işlemi canlı tutabiliyor muyum?


Düzenle 1

Aslında denedim nohup, ancak Putty SSH terminalini kapatır kapatmaz veya internetimi çıkarır çıkarmaz sunucu işlemi hemen durur.

Putty'de yapmam gereken bir şey var mı?


Edit 2 (on Şub, 2012)

Sonsuza dek bir node.jsmodül var . Bu program node.js sunucusunu arka plan programı olarak çalıştıracaktır.


7
Benim durumumda nohup yazarak Terminal'den çıktığımda çalışır exit. Macun penceresini kapattığımda başarısız oluyor.
Pawel Furmaniak

Yanıtlar:


513

Basit çözüm (sürece geri dönmekle ilgilenmiyorsanız, çalışmaya devam etmesini isteyin):

nohup node server.js &

jobsBu arka planlı işlemlerin dizinlenmiş bir listesini görme komutu da vardır . Ve arka plandaki bir işlemi çalıştırarak kill %1veya kill %2sayının işlemin dizini olmasıyla öldürebilirsiniz .

Güçlü çözüm (etkileşimli ise işleme yeniden bağlanmanızı sağlar):

screen

Daha sonra Ctrl + a + d tuşlarına basarak çıkarabilir ve ardından screen -r

Ayrıca, ekrana daha yeni bir alternatif olan tmux'u düşünün.


1
Eğer "ekran" ı çalıştırırsam, ekranı oluşturur ve içinde çalışırım, değil mi?
murvinlai

30
evet ve daha sonra Ctrl + a, d tuşlarına basarak ayırabilir ve -r
MK

1
@murvinlai EC2 bir ortamdır ve kök ayrıcalığı ile ilgisi yoktur. Muhtemelen AMI'nizle ilgili. Örneğin Amazon AMI ile kesinlikle yapabilirsiniz sudo bash.
ShuaiYuan

1
man bash: Bir komut kontrol operatörü & tarafından sonlandırılırsa, kabuk, komutu alt kabukta arka planda yürütür. Kabuk komutun bitmesini beklemez ve dönüş durumu 0'dır.
MK.

34
Bir ekran içinde node.js sunucuyu çalıştıran veya tmux oturumu ise: kimseye bu okuma Lütfen AMATÖR çözüm! Hızlı testler yapmadıkça bunu yapmayın. Bir işlemi devam ettirmek için bunu arka plana almanız gerekir! Gibi, bunun için uygun araçları kullanın sonsuza , pM2 veya düz eski init.d komut .
Victor Schröder

1119

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

  1. nohupAnlamı: Stty kesilse bile bu işlemi sonlandırmayın.
  2. > /dev/nullşu anlama gelir: stdout / dev / null (herhangi bir çıktı kaydetmeyen sahte bir aygıttır) 'a gider.
  3. 2>&1şu anlama gelir: stderr ayrıca stdout'a da gider (zaten yönlendirilmiş olan /dev/null). Hata günlüğünü tutmak için & 1'i bir dosya yoluyla değiştirebilirsiniz, örneğin:2>/tmp/myLog
  4. &sonunda: bu komutu arka plan görevi olarak çalıştırın.

49
Kabul edilen cevap bu olmalı, çünkü şu anda kabul edilen cevaptan çok daha yüksek kalitede.
L0j1k

2
@ L0j1k tartışmalı, OP kabul edilen cevap için daha fazla açıklamanın gerekli olduğunu anlayan bir seviye göstermiştir.
JFA

41
Bu yüzden OP'nin yardım sorusuna gelen binlerce insanla ilgili olduğu kadar OP ile de ilgili değil.
L0j1k

3
Stdout ve stderr'i yönlendirmek gerekli mi? Onları hiç yönlendirmediysem de işe yarar mı? Ya da onları dosyalara yönlendirirsem?
Shawn

10
Stdout VE stderr'yi gönder /dev/null? Güzel günlüğe kaydetme ... Bu hata ayıklamaya çalışırken iyi şanslar ...
Victor Schröder

138

Gerçekten kullanmaya çalışmalısınız screen. Sadece yapmaktan biraz daha karmaşıktır nohup long_running &, ancak bir daha asla geri gelmediğinde ekranı anlamak.

İlk önce ekran oturumunuzu başlatın:

user@host:~$ screen

İstediğiniz her şeyi çalıştırın:

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

Ctrl + A ve ardından d tuşlarına basın. Bitti. Oturumunuz arka planda devam ediyor.

0673.pts-0.srv'nin bir giriş listesi olduğu tüm oturumları listeleyebilir screen -lsve screen -r 20673.pts-0.srvkomutla bazılarına ekleyebilirsiniz .


125

Bu eski bir soru, ancak Google'da üst sıralarda yer alıyor. Neredeyse en yüksek oy alan cevaplara inanamıyorum, çünkü bir ekran oturumunda, &hatta ile veyanohup bayrağıyla - hepsi ile - sadece geçici çözümlerdir.

Özellikle amatör bir çözüm olarak düşünülmesi gereken ekran / tmux çözümü. Screen ve Tmux, süreçleri çalışır durumda tutmak için değil, çoklayıcı terminal oturumları içindir. Sunucunuzda bir komut dosyası çalıştırdığınızda ve bağlantıyı kesmek istediğinizde sorun yoktur. Ancak bir node.js sunucusu için, işleminizin bir terminal oturumuna eklenmesini istemezsiniz. Bu çok kırılgan. İşleri yürütmek için süreci arka plana ayırmanız gerekir!

Bunu yapmak için birçok iyi araç var.

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

PM2 lehine gördüğüm büyük bir avantaj, yeniden başlatmalar arasında işlemin devam etmesini sağlamak için sistem başlatma komut dosyasını oluşturabilmesidir:

$ pm2 startup [platform]

Nerede platformolabilir ubuntu|centos|redhat|gentoo|systemd|darwin|amazon.

forever.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

Başlangıç ​​komut dosyaları :

Bir init betiği yazma konusunda ayrıntıya girmiyorum, çünkü bu konuda uzman değilim ve bu cevap için çok uzun olurdu, ancak temel olarak OS olayları tarafından tetiklenen basit kabuk komut dosyalarıdır. Bununla ilgili daha fazla bilgiyi buradan edinebilirsiniz

Liman işçisi :

Sadece bir Docker kapta sunucu çalıştırmak -dseçeneği ve, voila , bir daemonized node.js sunucu var!

Örnek bir Dockerfile örneği (node.js resmi kılavuzundan ):

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" ]

Ardından resminizi oluşturun ve kapsayıcınızı çalıştırın:

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

Umarım bu kişinin bu sayfaya inmesine yardımcı olur. Her zaman iş için uygun aleti kullanın. Size çok fazla baş ağrısı ve saatlerce kurtaracak!


2
Aradığım şey buydu. Pm2 çözümü ile, daha sonra bir terminal iliştirmenin bir yolu var mı?
Quantumplation

4
@Kuantumplasyon, hayır. Bu mümkün değildir çünkü işlem etkileşimli bir oturumda çalışmaz. Ancak tail -fpm2'nin oluşturduğu günlük dosyasını girerek aynı "his" e sahip olabilirsiniz .
Victor Schröder

1
screenBirçok insanın bulduğu çözümü belirlersiniz, iş geçici bir çözümdür. Belirli bir görevi yerine getirmenin birçok yolu vardır. İnanıyorum ki (belirli bir soruyu düşünün) run as background and never die, birçokları için mükemmel olan belirli bir görevi başarıyor . Ayrıca, kullanıcının yeniden etkileşim kurmak ve isterse değişiklik yapmak için geri dönmesine izin verme avantajı da vardır. Anahtar bileşenler backgroundve never die. Tüm çözümlerin belirli bonusları vardır.
LD James

@ Rakshith Ravi - Katılmıyorum. Bunların tümü ek indirme / yazılım / araç gerektirir (çözüm bulunmayan init çözümü hariç). nohup Bir çözelti. Linux'ta pişirilir ve bunun için oradadır. Bu bir satır, temiz ve güncellemelerden bağımsız olarak her zaman amaçlandığı gibi çalışır. İnsanlar, bunun gibi temel kullanım durumları için üçüncü taraf araçlarını kullanmaktan kaçınmaya çalışmalıdır. Docker örneği (örneğin), en çok oylanan cevaptaki basit komuttan çok daha ayrıntılı ve kaynak yoğun. Docker'ı seviyorum, ama bunun için değil.
Jack_Hu

1
@Jack_Hu, genel gider konusunda hiçbir şüphem yok, ancak nohupçözüm "asla ölme" gereksinimini karşılamıyor. Çok zor trapya da haksız bir sonsuz döngü yazmadığınız sürece, bu amaç için özel olarak yazılmış araçları (ya da elbette kendi yazdığınız bir init betiğini) kullanmadan sürecin nasıl daemonize tutulacağını görmüyorum.
Victor Schröder

24

işi reddeden başka bir çözüm

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

reddetme tam olarak aradığım şey, ama -h bayrağı ne işe yarar? Kılavuzda bulamıyorum
Rimantas Jacikevicius

man sayfasından: -h seçeneği belirtilirse, her jobpec tablodan kaldırılmaz, ancak kabuk bir SIGHUP alırsa SIGHUP işe gönderilmeyecek şekilde işaretlenir. Hiç jobpec sağlanmazsa, -a seçeneği tüm işleri kaldırmak veya işaretlemek anlamına gelir;
myururdurmaz

14

nohupterminal öldükten sonra bile programın devam etmesine izin verecektir. Aslında nohupSSH oturumunun doğru şekilde sonlandırılmasını önleyen durumlar yaşadım , bu yüzden girişi de yönlendirmelisiniz:

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

Nasıl nohupyapılandırıldığına bağlı olarak, standart çıktıyı ve standart hatayı dosyalara yeniden yönlendirmeniz gerekebilir.


7

Kabuk rc dosyamda @ Yoichi'nin cevabına dayanan bu fonksiyon var:

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

Bu şekilde kullanabilirsiniz:

nohup-template "command you would execute here"

7

Nohup ve ekran, Node.js'yi arka planda çalıştırmak için mükemmel ışık çözümleri sunar. Node.js işlem yöneticisi ( PM2 ) dağıtım için kullanışlı bir araçtır. Sisteminize global olarak npm ile yükleyin:

npm install pm2 -g

Node.js uygulamasını arka plan programı olarak çalıştırmak için:

pm2 start app.js

İsteğe bağlı olarak , Unitech tarafından yapılan bir izleme SAAS'ına Keymetrics.io'ya bağlayabilirsiniz .


6
$ disown node server.js &

Komutu aktif görev listesinden kaldıracak ve komutu arka plana gönderecek



3

Debian'da sysv init ile komutu sistem hizmeti olarak çalıştırmak için:

İskelet betiğini kopyalayın ve ihtiyaçlarınıza göre uyarlayın, muhtemelen tek yapmanız gereken bazı değişkenler ayarlamaktır. Komut dosyanız, /lib/init/init-d-scriptgereksinimlerinize uymayan bir şeyden varsayılan ayarları devralır - betiğinizde geçersiz kılar. Bir şeyler ters giderse ayrıntıları kaynakta görebilirsiniz /lib/init/init-d-script. Zorunlu değişkenler DAEMONve NAME. Komut dosyası start-stop-daemonkomutunuzu çalıştırmak için kullanılacak , içinde kullanmak için START_ARGSek parametreler tanımlayabilirsiniz 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

Benim wikimedia wiki için bazı python şeyler çalıştırmak böyle:

...
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
}

Değişken ayarı yanı sıra do_stop_cmdpython çalıştırılabilir yerine geçer nedeniyle geçersiz kılmak zorunda kaldı , bu yüzden hizmet düzgün durmadı.


3

Yukarıdaki harika çözümlerin yanı sıra, süreci başlatmaya, varlığını izlemeye ve ölürse başlatmaya izin veren denetim ve izleme araçlarından da bahsetmiştim. 'Monit' ile işlemin http isteğine yanıt verip vermediğini kontrol etme gibi bazı etkin denetimler de yapabilirsiniz


3

Ubuntu için bunu kullanıyorum:

(exec PROG_SH &> / dev / null &)

Saygılarımızla


Küçük nokta: PROG_SH yürütülebilir bir dosyaysa 'exec' gerekmez. David tarafından önerilen çözümün amacı, çocuğu mevcut çalışan kabuktan ayırmaktır. Çocuğun ebeveyni 'pid 1' olur ve kabuk sona erdiğinde etkilenmez.
SoloPilot

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.