Node.js dosyasından nasıl çıkılır


1866

Çıkmak için kullanılan komut nedir? (örneğin, Node.js işlemini sonlandırın)

Yanıtlar:


2375

Genel processnesnenin exityöntemini çağırın :

process.exit()

Dokümanlardan:

process.exit ([kodu])

İşlemi belirtilen ile sonlandırır code. Atlanırsa, çıkış 'başarı' kodunu kullanır 0.

'Başarısızlık' koduyla çıkmak için:

process.exit(1);

Düğümü yürüten kabuk çıkış kodunu olarak görmelidir 1.


5
Sadece bir şeyler eklemek istiyorum. Eğer bir talebi ele alıyorsanız, aynı end()zamanda talebi de yapmalısınız . Aksi takdirde sadece asılır.
pixelfreak

126
@pixelfreak, exithiç yanıltıcı değil. Düğümün nasıl çalıştığı konusunda kafanız karıştı. Düğümü sunucunun kendisi olarak düşünün. PHP, Apache gibi bir web sunucusunda olduğu gibi, yalnızca gerektiği gibi çalıştırılmaz. Düğümün web sunucularıyla hiçbir ilgisi olması gerekmez! Yararlı şeyler yapmak için bazı yerleşik kütüphanelerle birlikte, bazı JavaScriptler için bir ana makinedir.
Brad

6
@Brad Ve PHP genel amaçlı bir dildir. mod_phpApache ile çalıştırmaya veya kullanmaya gerek yok . Eğer gerçekten de düğümde olduğu gibi FastCGI gibi daha aklı başında / standartlaşmış bir yaklaşım istiyorsanız, PHP'de bir düğümün yaptığı gibi httpd'yi yeniden uygulayabilirsiniz.
binki

38
Not edin process.exit()edilir önerilmez açıklandığı gibi, aşağıda bu cevap .
AndreasPizsa

409

Sadece bir nota kullanarak bu process.exit([number])olduğunu önerilen değil pratik.

Arayan process.exit()hala henüz Ç için operasyonlar I / dahil tamamen tamamlamadığınızı bekleyen asenkron işlemleri olsa bile hızlı mümkün olduğunca çıkmak için süreci zorlar process.stdoutve process.stderr.

Çoğu durumda, process.exit()açıkça arama yapmak gerekli değildir . Olay döngüsünde beklemede olan başka bir iş yoksa Node.js işlemi kendiliğinden çıkar. process.exitCodeMülkiyet çıkış kodu ne zaman süreç sonlandığında incelikle kullanmak sürecini anlatmak için ayarlanabilir.

Örneğin, aşağıdaki örnek göstermektedir kötüye arasında process.exit()basılı veri neden olabilir yöntem stdoutkesildi ve kaybolmuş:

// This is an example of what *not* to do:
if (someConditionNotMet()) {
  printUsageToStdout();
  process.exit(1);
}

Bunun sorunlu olmasının nedeni process.stdout, Node.js dosyasındaki yazma işlemlerinin bazen eşzamansız olması ve Node.js olay döngüsünün birden çok kenarı üzerinde gerçekleşebilmesidir. Arayan process.exit(), ancak, söz konusu ek yazma önce çıkmak için zorlar stdoutyapılabilir.

process.exit()Kod, doğrudan çağırmak yerine process.exitCode, olay döngüsü için herhangi bir ek iş planlamaktan kaçınarak sürecin doğal olarak çıkmasına izin vermeli ve işlemden çıkmasına izin vermelidir:

// How to properly set the exit code while letting
// the process exit gracefully.
if (someConditionNotMet()) {
  printUsageToStdout();  
  process.exitCode = 1;
}

31
Bu, en iyi cevap. Diğer cevaplar, düğümün çıkıştan önce bekleyen olayları düzgün bir şekilde işlemesine izin vermeyebilir, çok üzücü :(
djabraham

3
Kabul etti, daha fazla oy olmalı! Shelljs.exec üzerinden birden fazla alt işlem başlatan bir düğüm komut dosyası vardı ve alt işlemlerden herhangi biri başarısız olursa genel komut dosyamın bir hata çıkış kodu ile dönmek istedim. process.exitCode = 1 exec geri çağrılarında harika çalıştı (oysa orada process.exit (1) çağrısı tüm alt süreçler bitmeden ana komut dosyasından çıkacaktır!)
Nick

15
Bu cevabı kullandım ve süreçlerimin hiç çıkmadığını gördüm. Ctrl-C gerekiyordu.
jcollum

34
Anında işlem ve bekleyen olay sonlandırması için birçok kullanım durumu vardır. Tam process.exit()olarak amaçlanan budur .
Dominic Cerisano

7
Bu herhangi bir streç için en iyi cevap değildir, çünkü soruyu cevaplamamaktadır. Bunun yerine, bir nodejs programı için kod akışının nasıl geliştirileceği konusunda en iyi uygulamaları sağlar.
anon58192932

365

Resmi nodejs.org belgelerinden:

process.exit(code)

İşlemi belirtilen kodla sonlandırır. Atlanırsa, çıkış 'başarı' kodunu 0 kullanır.

'Başarısızlık' koduyla çıkmak için:

process.exit(1);

9
@Alison evet, ya da daha doğrusucode = 0; process.exit(code);
wprl

7
Eğer çıkıyorsanız, muhtemelen değerini önemsemediğiniz doğru codemu?
Armand

8
@Alison Daha iyi bir fikir, process.exit()kod varsayılan olarak 0 olduğu için sadece parametresizdir
Jeremy Moritz

2
@Armand Doğru - Kod yalnızca bir değişkendir ve bu durumda parametrenin ne olduğunu belirtmek için kullanılır. Böylece .exit (0), örneğin yaptığı her şeyi yapar.
Gerard ONeill

23
@Kodu sizin için değil, kodunuzu çalıştıran her şey için. Örneğin, bir exit_0.js dosyası oluşturup onunla process.exit(0);çalıştırırsanız node exit_0.js && echo 'success'"başarılı" der. Exit_1.js ile birlikte oluşturur process.exit(1);ve çalıştırırsanız node exit_1.js && echo 'success', işleminiz sıfırdan farklı bir işlemden ("kabuğa bir" başarısızlık "veya" anormal çıkış "olduğunu gösterir)" başarılı "demez. Buna ek olarak, vs'yi $?çalıştırırsanız farklı değerler görürsünüz (yaparak ve sonra kontrol edebilirsiniz ). node exit_1.jsnode exit_0.jsnode exit_1.jsecho $?
msouth

277

Unix terminalinde veya Windows komut satırındaysanız ve Düğüm REPL'inden çıkmak istiyorsanız, ...

  • Ctrl+ Tuşuna Ciki kez basın veya
  • yazın .exitve Enter tuşuna basın veya
  • satır başında Ctrl+ tuşuna basın D(yalnızca Unix)

14
Düğümün ötesinde, Mac veya Linux'ta Ctrl + D kısayolunun, Bash gibi Unix kabukları, MySQL ve PostgreSQL gibi veritabanlarının kabukları ve programlama dilleri için REPL'ler de dahil olmak üzere karşılaşacağınız neredeyse tüm kabuklarda ve REPL'lerde çalıştığını unutmayın. Python, PHP ve Ruby. Kullandığım mermilerden çıkmanın tek yolu bu.
Mark Amery

2
İçin nodede Windows üzerinde çalışır, böylece repl, çıkmak için Ctrl + D standart davranıştır.
Alan

Ctrl + C'ye (Mac'te bile!) Basın
Prens


79

Bu neden node.js işleminden çıkmak istediğinize bağlıdır, ancak her durumda dikkate alınmasıprocess.exit() gereken son seçenek budur . Dokümanlardan bir alıntı:

Bu nota önemli olduğunu çağıran process.exit()hala henüz Ç için operasyonlar I / dahil tamamen tamamlamadığınızı bekleyen asenkron işlemleri olsa bile hızlı mümkün olduğunca çıkmak için süreci zorlar process.stdoutve process.stderr.

Çoğu durumda, process.exit()açıkça arama yapmak gerekli değildir . Olay döngüsünde beklemede olan başka bir iş yoksa Node.js işlemi kendiliğinden çıkar. process.exitCodeMülkiyet çıkış kodu ne zaman süreç sonlandığında incelikle kullanmak sürecini anlatmak için ayarlanabilir.

Düğüm.js işleminden çıkmaya istekli olabileceğiniz ve neden kaçınmanız gerektiğinin olası nedenlerini ele alalım process.exit():

Durum 1 - Yürütme tamamlandı (komut satırı komut dosyası)

Komut dosyası sonuna ulaştıysa ve düğüm yorumlayıcısı çıkmazsa, bazı zaman uyumsuz işlemlerin hala beklemede olduğunu gösterir. process.exit()Bu noktada işlemin sonlandırılmasını zorlamak yanlıştır . Betiğinizin beklenen şekilde çıkmasını neyin engellediğini anlamaya çalışmak daha iyidir . Bunu çözdüğünüzde, process.exitCodeherhangi bir sonucu arama işlemine döndürmek için kullanabilirsiniz .

Durum 2 - Harici sinyal nedeniyle sonlandırma (SIGINT / SIGTERM / diğer)

Örneğin, hızlı bir uygulamayı zarif bir şekilde kapatmak istiyorsanız . Komut satırı komut dosyasından farklı olarak, ekspres uygulama sürekli olarak yeni istekleri beklemeye devam eder. process.exit()burada kötü bir seçenek olacaktır, çünkü bu, boru hattındaki tüm istekleri kesecektir. Bazıları da idempotent olmayabilir (GÜNCELLEME, SİL). İstemci, bu isteklerin sunucu tarafında tamamlanıp tamamlanmadığını asla bilemez ve istemci ile sunucu arasındaki veri tutarsızlığının nedeni olabilir. Tek iyi çözüm, http sunucusuna yeni istekleri kabul etmeyi durdurmasını ve bekleyenlerin bitmesini beklemesini söylemektir server.close():

var express = require('express');
var app = express();
var server = app.listen(80);

process.on( 'SIGTERM', function () {
   server.close(function () {
     console.log("Finished all requests");
   });
});

Hala çıkmıyorsa - bkz. Durum 1.

Durum 3 - Dahili hata

throwBir hata için her zaman daha iyidir , güzel biçimlendirilmiş yığın izleme ve hata mesajı alırsınız. Üst düzey kodlar her zaman error ( catch) ile işlem yapıp yapamayacaklarına veya işlemin çökmesine izin verip vermeyeceğine karar verebilir . Öte yandan, process.exit(1)sessizce süreci sonlandıracak ve bundan kurtulma şansı olmayacak. Tek "yararı" process.exit()olabilir, işlemin sonlandırılacağından emin olabilirsiniz.


4
İnanılmaz tepki. Process.exit()çoğu uygulama için büyük bir overkill gibi görünüyor. Ben php's die () fonksiyonu eşdeğer arıyordu ... daha fazla gibi:throw new Error('die msg')
AvadData

Kapatma isteği alınana kadar sürekli yürütülmesi gereken bir grup kod varsa, olayları kaydetmek için, olayları kullanan kod gerektirmeden aboneliklerin bir kapatma isteğine yanıt olarak terk edilmesine izin verecek güzel bir kural var mı? veya kapatma talebinde bulunan kodun birbiriyle ilgili özel bilgisi var mı? Ne yazık ki, bir olayı kaydeden herhangi bir kod parçasının da kaydını silmek için bir kapak içeren bir sarıcı oluşturmasını gerektirecek türden bir uygulamayı düşünmenin tek yolu.
supercat

26

REPL (Komut Satırı)

  • İki kez basınctrl + c

  • Yazın .exitve enter tuşuna basın

Komut dosyaları

process.exit(code)

Bekleyen zaman uyumsuz işlem olmadığında düğüm normalde 0 koduyla çıkar .

process.exit(1) Bir hata kodu ile çıkmak için kullanılmalıdır.Bu, düğümün zarifçe kapanmadığını ve kapanmaya zorlandığını çıkarmamıza izin verecektir.

Gibi başka çıkış kodları var

3 - Dahili JavaScript Ayrıştırma Hatası (çok nadir)

5 - v8 javascript motorunda önemli hata

9 - Geçersiz argüman

Tam liste için düğüm çıkış kodlarına bakın


12

İstediğim bir başvurum var:

  1. Kullanıcıya e-posta gönder
  2. Hata kodu ile çık

process.exit(code)Bir exitolay işleyiciye bağlanmak zorunda kaldım , yoksa çağrı process.exit(code)doğrudan eşzamansız olayları öldürdüğü için posta gönderilmez .

#!/usr/bin/nodejs
var mailer = require('nodemailer');
var transport = mailer.createTransport();
mail = {
  to: 'Dave Bowman',
  from: 'HAL 9000',
  subject: 'Sorry Dave',
  html: 'Im sorry, Dave. Im afraid I cant do <B>THAT</B>.'
}
transport.sendMail(mail);
//process.exit(1);
process.on('exit', function() { process.exit(1); });

4
İstediğin düşünüyorum process.exitCode
Julian de Bhal

Kayıt için: Günün iyi bir bölümünü, oluşturduğum process.exitCodebir komut satırı aracında (Düğüm v4.3.0'da test edildi) benim için çalışmaya çalışarak geçirdim . Ama belgelendiği gibi davranamadım. Bu çok iyi bir kenarı durumda olabilirdi commander- her ne kadar github.com/tj/commander.js/... beni meraklandırıyor. Başka birinin bu sorunu Düğüm 4 w / ile karşılaşıp karşılaşmadığından emin değilim, ancak ileride başvurmak üzere belgelenir.
mikermcneil

Bunun komutandan gelme olasılığı var, ben de sadece dep ( github.com/zhiyelee/graceful-readlink/… ) ama hiçbir zar baktı . Sadece olası suçlu gibi görünebilir : github.com/tj/commander.js/blob/… Özel olarak, sorun, ayarlasanız bile process.exitCode = 1, işlem 0 koduyla çıkar.
mikermcneil

11

@Dominic'in işaret ettiği gibi, yakalanmamış bir hata atmak process.exit ([kod]) işlevini çağırmak yerine daha iyi bir uygulamadır :
process.exitCode = 1; throw new Error("my module xx condition failed");


3
"Node.js'den nasıl çıkılır" sorusu bağlamında ele alındığında, bu korkunç bir tavsiye. Sorunun özellikle hatadan nasıl çıkılacağını sorması durumunda öneriniz çok daha mantıklı olacaktır. Yanıtınızı, yalnızca bir hata durumunda uygulamadan çıkmaya çalıştıklarında, kullanıcının önerdiğiniz gibi yapacağını belirtecek şekilde yazmanızı öneririm .
rstackhouse

@rstackhouse, üzgünüm.Herşeyi gitti umut yakalanmamış hatayı atma hangi noktaları için -> nodejs.org/api/process.html#process_process_exit_code
MANN

5
Fırlatma problemi, çirkin cehennem yığını izidir. Bu yığın izlemesini önlemek için herhangi bir ipucu (kullanım doğru değilse CLI aracı çıkmak istediğinde geçerli değil)?
MoOx

9

Çıkışa doğru

let exitCode = 1;
process.exit(exitCode)

Faydalı çıkış kodları

1 - Genel hatalar için catchall
2 - Mermi yuvalarının yanlış kullanımı (Bash belgelerine göre)
126 - Çağrılan komut çalıştırılamıyor
127 - “komut bulunamadı”
128 - Çıkmak için geçersiz argüman
128 + n - Önemli hata sinyali “n”
130 - Komut dosyası, Control-C tarafından sonlandırıldı
255 \ * - Çıkış durumu aralık dışında


7

Kodda , isteğe bağlı bir tam sayı process.exit([errorcode])olduğu yerde kullanabilirsiniz [errorcode]( 0başarıyı belirtmek için varsayılan değerdir).

Eğer kullanıyorsanız Okuma Eval Döngü (REPL) Baskı kullanabileceğiniz Ctrl+ Dveya türünü.exit

Alternatif olarak, Windows veya Linux'ta Ctrl+ C, Ctrl+C

Mac'te komut Ctrl+ Z, Ctrl+Z


2
İki kontrol c de mac üzerinde çalışıyor, en azından benim ile node --version v0.10.18
msouth

Ctrl-z işlemi Mac'te gecikmeden öldürürken Control-C zaten planlanmış işlemleri iptal ediyor gibi görünmüyor.
jorisw

7

Ctrl + CVeya tuşuna iki kez basın .exit.

> 
(To exit, press ^C again or type .exit)
> 

3

Tüm düğüm işlemlerimin Windows 10'daki Git Bash kabuğundan doğrudan ölmesini sağlayabildim taskkill -F -IM node.exe- bu, bilgisayarımdaki tüm düğüm işlemlerini bir kerede bitiriyor. Ben de kullanabileceğimi buldum taskkill //F //IM node.exe. Neden ikisi de emin değilim -ve //bu bağlamda çalışır. Bu yardımcı olur umarım!


Bunun nedeni taskkill'in kendisidir. Süreçleri kendileri öldürüyorsunuz. Ayrıca, tek bir / yeterlidir.
Paul Stelian

2

İşlem genel nesne olduğundan, herhangi bir modülü içe aktarmanıza gerek yoktur. Aşağıdaki işlev geçerli düğüm işleminden çıkar veya öldürür.

process.exit (kod)

process.kill (process.pid)

process.abort ()


1

Düğüm uygulamasının çalıştığı komut satırı terminalini açın ve Ctrl + C tuşlarına basın

koddan bir düğüm js uygulamasından çıkmak istiyorsanız,

process.exit(); // graceful termination 
process.exit(1); // non graceful termination 

0

düğüm js uygulamasından çıkmak istiyorsanız yazın

process.exit(1)

kodunda


3
1, uygulamada diğer yanıtların açıklığa kavuştuğunu belirten bir hata olduğunu belirtmek için kullanılır.
Herick

0

Js düğümündeki çıkış iki şekilde yapılır:

  • Arayan () process.exit açıkça.
  • Veya, nodejs olay döngüsü tüm görevlerle yapılırsa ve yapacak hiçbir şey kalmazsa. Ardından, düğüm uygulaması otomatik olarak çıkacaktır.

Nasıl çalışır?

Yürütme döngüsünü işlemi durdurmaya zorlamak istiyorsanız , EventEmitter örneği olan genel değişken işlemini kullanabilirsiniz . Yani process.exit () öğesini çağırdığınızda , hala senkronize olmayan işlemler yapılmasa bile tüm görevleri derhal sona erdiren exit olayını yayarsınız .

process.exit () parametre olarak bir çıkış kodu (Tamsayı ) alır. 0 kodu varsayılan değerdir ve bu da 'başarılı' olarak çıktığı anlamına gelir. Kod 1 'hata' ile çıktığı anlamına gelir.


0

Windows'daysanız, Görev Yöneticisi'ne gidin, ardından İşlemler'e gidin, "düğüm" adlı bir işlemi arayın, ardından farenizin sağ düğmesiyle tıklayın ve ardından "İşlemi Sonlandır" seçeneğini tıklayın.


-1

Sen kullanabilir process.exit ([code]) fonksiyonu.

'Başarısız' olmadan çıkmak istiyorsanız kodu kullanırsınız 0:

process.exit(0);

'Başarısızlık' koduyla çıkmak için 1şunları yapabilirsiniz:

process.exit(1);

Hatanın 'hata' kodu uygulamaya özgüdür. Böylece kendi sözleşmelerinizi kullanabilirsiniz.

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.