คำสั่งที่ใช้ในการออกคืออะไร (เช่นยุติกระบวนการ Node.js)
คำสั่งที่ใช้ในการออกคืออะไร (เช่นยุติกระบวนการ Node.js)
คำตอบ:
เรียกวิธีการprocess
ของวัตถุทั่วโลกexit
:
process.exit()
process.exit ([code])
code
สิ้นสุดกระบวนการที่มีการระบุไว้ หากละเว้นออกใช้ 'ความสำเร็จ'0
รหัสหากต้องการออกด้วยรหัส 'ล้มเหลว':
process.exit(1);
1
เปลือกที่โหนดดำเนินการควรจะเห็นรหัสออกเป็น
exit
ไม่ทำให้เข้าใจผิดเลย คุณสับสนเกี่ยวกับการทำงานของโหนด คิดว่าโหนดเป็นเซิร์ฟเวอร์ตัวเอง มันไม่เพียงเพิ่มความจำเป็นเช่นเดียวกับ PHP อยู่ในเว็บเซิร์ฟเวอร์เช่น Apache โหนดไม่จำเป็นต้องมีอะไรเกี่ยวข้องกับเว็บเซิร์ฟเวอร์เลย! มันเป็นเพียงโฮสต์สำหรับ JavaScript บางตัวที่มีไลบรารีในตัวที่ดีสำหรับการทำสิ่งที่มีประโยชน์
mod_php
หรือใช้ Apache คุณสามารถปรับใช้ httpd ใหม่ใน PHP เช่นโหนดได้ถ้าคุณต้องการหรือใช้วิธีที่มีสติ / มาตรฐานมากกว่าเช่น FastCGI เช่นเดียวกับที่คุณทำในโหนด
เพียงแค่ทราบว่าการใช้process.exit([number])
จะไม่แนะนำการปฏิบัติ
โทร
process.exit()
จะบังคับให้กระบวนการเพื่อออกให้เร็วที่สุดเท่าที่เป็นไปได้แม้ว่ายังคงมีการดำเนินงานที่ไม่ตรงกันอยู่ระหว่างดำเนินการที่ยังไม่เสร็จสมบูรณ์รวมทั้งดำเนินการ I / O ไป และprocess.stdout
process.stderr
ในสถานการณ์ส่วนใหญ่ไม่จำเป็นต้องโทรหา
process.exit()
อย่างชัดเจน กระบวนการ Node.js จะออกเองถ้าไม่มีงานเพิ่มเติมที่ค้างอยู่ในเหตุการณ์วนรอบprocess.exitCode
คุณสมบัติที่สามารถตั้งค่าที่จะบอกกระบวนการที่รหัสทางออกที่จะใช้เมื่อออกจากกระบวนการได้อย่างสง่างามยกตัวอย่างเช่นตัวอย่างต่อไปนี้แสดงให้เห็นถึงการใช้ผิดประเภทของ
process.exit()
วิธีการที่จะนำไปสู่ข้อมูลที่พิมพ์จะstdout
ถูกตัดทอนและการสูญเสีย:// This is an example of what *not* to do: if (someConditionNotMet()) { printUsageToStdout(); process.exit(1); }
เหตุผลนี้เป็นปัญหาเนื่องจากเขียน
process.stdout
ใน Node.js บางครั้งไม่ตรงกันและอาจเกิดขึ้นในหลายติ๊กของเหตุการณ์ห่วง Node.jsprocess.exit()
อย่างไรก็ตามการโทรบังคับให้กระบวนการออกก่อนที่จะstdout
สามารถทำการเขียนเพิ่มเติมเหล่านั้นได้แทนที่จะเรียก
process.exit()
โดยตรงรหัสควรตั้งค่าprocess.exitCode
และอนุญาตให้กระบวนการออกตามธรรมชาติโดยหลีกเลี่ยงการกำหนดเวลาการทำงานเพิ่มเติมใด ๆ สำหรับเหตุการณ์ลูป:// How to properly set the exit code while letting // the process exit gracefully. if (someConditionNotMet()) { printUsageToStdout(); process.exitCode = 1; }
process.exit()
มีไว้สำหรับ
จากเอกสารnodejs.orgอย่างเป็นทางการ:
process.exit(code)
จบกระบวนการด้วยรหัสที่ระบุ หากไม่ได้ระบุไว้ทางออกจะใช้รหัส 'สำเร็จ'
หากต้องการออกด้วยรหัส 'ล้มเหลว':
process.exit(1);
code = 0; process.exit(code);
code
หรือเปล่าที่ว่าถ้าคุณกำลังออกไปคุณอาจไม่สนใจคุณค่าของมัน
process.exit()
ไม่มีพารามิเตอร์เป็นค่าเริ่มต้นของรหัสเป็น 0
process.exit(0);
และเรียกใช้ด้วยnode exit_0.js && echo 'success'
มันจะบอกว่า "สำเร็จ" หากคุณสร้าง exit_1.js ด้วยprocess.exit(1);
และรันnode exit_1.js && echo 'success'
มันจะไม่พูดว่า "สำเร็จ" เนื่องจากกระบวนการของคุณออกโดยไม่เป็นศูนย์ (ซึ่งระบุว่า "ล้มเหลว" หรือ "ออกผิดปกติ" ไปยังเชลล์) นอกจากนี้คุณจะเห็นค่าที่แตกต่างกัน$?
หากคุณใช้node exit_1.js
vs node exit_0.js
(คุณสามารถตรวจสอบได้โดยการทำnode exit_1.js
แล้วทำecho $?
)
หากคุณอยู่ในเทอร์มินัล Unix หรือบรรทัดรับคำสั่งของ Windows และต้องการออกจาก Node REPL ก็อาจ ...
.exit
และกด Enter หรือnode
REPL, Ctrl + D เพื่อออกเป็นพฤติกรรมมาตรฐานดังนั้นจึงสามารถใช้งานได้กับ Windows
จากบรรทัดคำสั่ง.exit
คือสิ่งที่คุณต้องการ:
$ node
> .exit
$
มันเป็นบันทึกไว้ในเอกสาร REPL REPL (Read-Eval-Print-Loop) คือสิ่งที่เรียกว่าบรรทัดคำสั่งโหนด
process.exit([code])
จากโปรแกรมปกติการใช้งาน
มันขึ้นอยู่กับเหตุผลที่ว่าทำไมคุณยินดีที่จะออกจากกระบวนการ Node.js แต่ในกรณีใด ๆprocess.exit()
เป็นตัวเลือกสุดท้ายที่จะต้องพิจารณา คำพูดจากเอกสาร:
มันเป็นสิ่งสำคัญที่จะต้องทราบว่าการโทร
process.exit()
จะบังคับให้กระบวนการเพื่อออกให้เร็วที่สุดเท่าที่เป็นไปได้แม้ว่ายังคงมีการดำเนินงานที่ไม่ตรงกันอยู่ระหว่างดำเนินการที่ยังไม่เสร็จสมบูรณ์รวมทั้งดำเนินการ I / O ไปและprocess.stdout
process.stderr
ในสถานการณ์ส่วนใหญ่ไม่จำเป็นต้องโทรหา
process.exit()
อย่างชัดเจน กระบวนการ Node.js จะจบลงด้วยตัวเองหากไม่มีงานเพิ่มเติมที่ค้างอยู่ในเหตุการณ์วนรอบprocess.exitCode
คุณสมบัติที่สามารถตั้งค่าที่จะบอกกระบวนการที่รหัสทางออกที่จะใช้เมื่อออกจากกระบวนการได้อย่างสง่างาม
มาอธิบายถึงเหตุผลที่เป็นไปได้ว่าทำไมคุณยินดีที่จะออกจากกระบวนการ node.js และเหตุผลที่คุณควรหลีกเลี่ยงprocess.exit()
:
หากสคริปต์ถึงจุดสิ้นสุดและล่ามโหนดไม่ออกก็แสดงว่าการดำเนินการ async บางอย่างยังคงค้างอยู่ มันผิดที่จะบังคับให้ยุติกระบวนการด้วยprocess.exit()
ณ จุดนี้ ดีกว่าที่จะพยายามทำความเข้าใจกับสิ่งที่สคริปต์ของคุณไม่ให้ออกในลักษณะที่คาดไว้ และเมื่อคุณชำระบัญชีคุณสามารถใช้process.exitCode
เพื่อส่งคืนผลลัพธ์ใด ๆ ให้กับกระบวนการเรียก
ตัวอย่างเช่นหากคุณยินดีที่จะปิดแอปด่วนอย่างสง่างาม ซึ่งแตกต่างจากสคริปต์บรรทัดคำสั่งแอปด่วนยังคงทำงานอย่างไม่มีที่สิ้นสุดรอคำขอใหม่ process.exit()
จะเป็นตัวเลือกที่ไม่ดีที่นี่เพราะมันจะขัดจังหวะการร้องขอทั้งหมดที่อยู่ในขั้นตอน และบางส่วนอาจไม่ใช่ idempotent (UPDATE, DELETE) ลูกค้าจะไม่ทราบว่าการร้องขอเหล่านั้นเสร็จสมบูรณ์หรือไม่บนฝั่งเซิร์ฟเวอร์และอาจเป็นสาเหตุของข้อมูลที่ไม่สอดคล้องกันระหว่างไคลเอนต์และเซิร์ฟเวอร์ ทางออกที่ดีเพียงอย่างเดียวคือบอกเซิร์ฟเวอร์ http ให้หยุดรับคำขอใหม่และรอให้คำขอที่รอดำเนินการเสร็จสิ้น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");
});
});
หากยังไม่ออกให้ดูที่กรณีที่ 1
throw
ข้อผิดพลาดจะดีกว่าเสมอคุณจะได้รับการติดตามสแต็กและข้อความแสดงข้อผิดพลาดในรูปแบบที่ดี ระดับสูงสุดของรหัสสามารถตัดสินใจได้เสมอว่าพวกเขาสามารถจัดการกับข้อผิดพลาด ( catch
) หรือปล่อยให้มันขัดข้องในกระบวนการ ในอีกด้านหนึ่งprocess.exit(1)
จะยุติกระบวนการอย่างเงียบ ๆ และจะไม่มีโอกาสกู้คืนจากสิ่งนี้ มันอาจเป็นเพียง "ผลประโยชน์" ของprocess.exit()
คุณสามารถมั่นใจได้ว่ากระบวนการจะถูกยกเลิก
Process.exit()
ดูเหมือนว่า overkill สำคัญสำหรับการใช้งานส่วนใหญ่ ฉันกำลังมองหาฟังก์ชันเทียบเท่ากับ php's die () ... ชอบมากขึ้น:throw new Error('die msg')
REPL (บรรทัดคำสั่ง)
กดctrl + c
สองครั้ง
พิมพ์.exit
และกด Enter
ไฟล์สคริปต์
process.exit(code)
โดยปกติโหนดจะออกด้วยรหัส 0เมื่อไม่มีการดำเนินการ async อีกต่อไป
process.exit(1)
ควรใช้เพื่อออกด้วยรหัสความล้มเหลวซึ่งจะช่วยให้เราสามารถสรุปได้ว่าโหนดไม่ได้ปิดอย่างสง่างามและถูกบังคับให้ปิด
มีรหัสทางออกอื่น ๆ เช่น
3 - ข้อผิดพลาดในการแยกวิเคราะห์ JavaScript ภายใน (หายากมาก)
5 - ข้อผิดพลาดร้ายแรงในเครื่องมือ v8 javascript
9 - อาร์กิวเมนต์ไม่ถูกต้อง
สำหรับรายการทั้งหมดดูรหัสทางออกของโหนด
ฉันมีแอปพลิเคชันที่ฉันต้องการ:
ผมต้องเบ็ดprocess.exit(code)
ไปสู่การexit
จัดการเหตุการณ์หรืออื่นจดหมายจะไม่ถูกส่งตั้งแต่โทรprocess.exit(code)
โดยตรงฆ่าเหตุการณ์ไม่ตรงกัน
#!/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); });
process.exitCode
ทำงานให้ฉันด้วยเครื่องมือบรรทัดคำสั่งที่ฉันกำลังสร้าง (ทดสอบกับโหนด v4.3.0) แต่ฉันไม่สามารถทำให้มันเป็นเอกสารได้ สิ่งนี้เป็นอย่างดีอาจเป็นกรณีที่มีcommander
- แม้ว่าgithub.com/tj/commander.js/…ทำให้ฉันสงสัย ไม่แน่ใจว่าใครออกไปเห็นว่ามีปัญหานี้ด้วยโหนด 4 แต่บันทึกไว้เพื่อใช้อ้างอิงในอนาคต
process.exitCode = 1
กระบวนการจะออกโดยใช้รหัส 0
ตามที่ @Dominic ชี้ให้เห็นการขว้างข้อผิดพลาดที่ไม่ได้รับการจับเป็นการปฏิบัติที่ดีกว่าแทนที่จะเรียกใช้process.exit ([code]) :
process.exitCode = 1;
throw new Error("my module xx condition failed");
เพื่อออกจาก
let exitCode = 1;
process.exit(exitCode)
รหัสทางออกที่มีประโยชน์
1 - Catchall สำหรับข้อผิดพลาดทั่วไป 2 - การใช้งานเชลล์บิลด์ในทางที่ผิด (ตามเอกสาร Bash) 126 - คำสั่งที่เรียกใช้ไม่สามารถดำเนินการได้ 127 -“ ไม่พบคำสั่ง” 128 - อาร์กิวเมนต์ไม่ถูกต้องเพื่อออก 128 + n - สัญญาณข้อผิดพลาดร้ายแรง“ n” 130 - สคริปต์ถูกยกเลิกโดย Control-C 255 \ * - ออกจากสถานะนอกช่วง
จากรหัสคุณสามารถใช้โดยprocess.exit([errorcode])
ที่[errorcode]
เป็นจำนวนเต็ม0
ก็ได้
หากคุณใช้Read Eval Print Loop (REPL)คุณสามารถใช้Ctrl+ Dหรือพิมพ์.exit
อีกวิธีหนึ่งบน Windows หรือ Linux คุณสามารถใช้Ctrl+ C, Ctrl+C
สำหรับ Mac คำสั่งคือCtrl+ Z, Ctrl+Z
node --version
v0.10.18
กดสองครั้งหรือCtrl + C
.exit
>
(To exit, press ^C again or type .exit)
>
ฉันสามารถทำให้กระบวนการโหนดทั้งหมดของฉันตายโดยตรงจาก Git Bash shell บน Windows 10 โดยพิมพ์taskkill -F -IM node.exe
- นี่จะจบกระบวนการโหนดทั้งหมดในคอมพิวเตอร์ของฉันทันที taskkill //F //IM node.exe
ผมพบว่าผมยังสามารถใช้ ไม่แน่ใจว่าทำไมทั้งคู่-
และ//
ทำงานในบริบทนี้ หวังว่านี่จะช่วยได้!
เนื่องจากโปรเซสเป็นวัตถุส่วนกลางคุณไม่จำเป็นต้องนำเข้าโมดูลใด ๆ ฟังก์ชันต่อไปนี้ออกหรือฆ่ากระบวนการโหนดปัจจุบัน
process.exit (รหัส)
Process.Kill (process.pid)
process.abort ()
เปิดเทอร์มินัลบรรทัดคำสั่งที่แอปพลิเคชันโหนดกำลังทำงานและกดCtrl + C
หากคุณต้องการออกจากแอปพลิเคชันโหนด js จากรหัส
process.exit(); // graceful termination
process.exit(1); // non graceful termination
หากคุณต้องการออกจาก node js application ให้เขียน
process.exit(1)
ในรหัสของคุณ
หากคุณต้องการที่จะบังคับให้ห่วงการดำเนินการที่จะหยุดกระบวนการโย่สามารถใช้ตัวแปรทั่วโลกกระบวนการซึ่งเป็นตัวอย่างของEventEmitter ดังนั้นเมื่อคุณเรียกใช้process.exit ()คุณจะปล่อยเหตุการณ์exitที่จบภารกิจทั้งหมดทันทีแม้ว่าจะยังไม่มีการดำเนินการแบบอะซิงโครนัสก็ตาม
process.exit ()รับโค้ดทางออก (จำนวนเต็ม) เป็นพารามิเตอร์ รหัส0เป็นค่าเริ่มต้นซึ่งหมายความว่าจะออกโดยมี 'ความสำเร็จ' ในขณะที่รหัส1หมายถึงมันออกด้วย 'ล้มเหลว'
หากคุณอยู่ใน Windows ให้ไปที่ตัวจัดการงานจากนั้นไปที่กระบวนการค้นหากระบวนการที่เรียกว่า "โหนด" จากนั้นคลิกที่ปุ่มนั้นด้วยปุ่มขวาของเมาส์แล้วคลิกตัวเลือก "กระบวนการสิ้นสุด"
คุณสามารถใช้ฟังก์ชันprocess.exit ([code])
หากคุณต้องการออกโดยไม่มี "ความล้มเหลว" คุณใช้รหัส0
:
process.exit(0);
หากต้องการออกด้วยรหัส 'ล้มเหลว' 1
คุณสามารถเรียกใช้:
process.exit(1);
รหัส 'ความล้มเหลว' ของความล้มเหลวนั้นมีลักษณะเฉพาะกับแอปพลิเคชัน ดังนั้นคุณอาจใช้การประชุมของคุณเอง
end()
ขอเช่นกัน มิฉะนั้นมันจะหยุด