ขั้นตอนที่ 1: รับรองspawn
ว่าถูกต้องแล้ว
ก่อนอื่นให้ตรวจสอบเอกสารสำหรับ child_process.spawn (คำสั่ง args และตัวเลือก) :
เปิดตัวเป็นกระบวนการใหม่ที่มีให้กับอาร์กิวเมนต์บรรทัดคำสั่งในcommand
args
หากเว้นไว้ให้ใช้args
ค่าเริ่มต้นเป็น Array ที่ว่างเปล่า
อาร์กิวเมนต์ที่สามใช้เพื่อระบุตัวเลือกเพิ่มเติมซึ่งเป็นค่าเริ่มต้นไปที่:
{ cwd: undefined, env: process.env }
ใช้เพื่อระบุตัวแปรสภาพแวดล้อมที่จะมองเห็นได้ด้วยกระบวนการใหม่เริ่มต้นคือenv
process.env
ให้แน่ใจว่าคุณจะไม่ได้รับการวางอาร์กิวเมนต์บรรทัดคำสั่งใด ๆ ในcommand
และทั้งspawn
โทรถูกต้อง ดำเนินการต่อในขั้นตอนต่อไป
ขั้นตอนที่ 2: ระบุตัวปล่อยเหตุการณ์ที่ส่งเหตุการณ์ข้อผิดพลาด
ค้นหารหัสแหล่งที่มาของแต่ละสายไปspawn
หรือchild_process.spawn
คือ
spawn('some-command', [ '--help' ]);
และแนบผู้ฟังเหตุการณ์สำหรับเหตุการณ์ 'ข้อผิดพลาด' ดังนั้นคุณจะสังเกตเห็นตัวปล่อยเหตุการณ์ที่แน่นอนซึ่งกำลังขว้างมันเป็น 'จัดการ' หลังจากดีบักตัวจัดการนั้นสามารถลบออกได้
spawn('some-command', [ '--help' ])
.on('error', function( err ){ throw err })
;
ดำเนินการและคุณควรได้รับพา ธ ไฟล์และหมายเลขบรรทัดที่ผู้ฟัง 'ข้อผิดพลาด' ของคุณได้รับการลงทะเบียน สิ่งที่ต้องการ:
/file/that/registers/the/error/listener.js:29
throw err;
^
Error: spawn ENOENT
at errnoException (child_process.js:1000:11)
at Process.ChildProcess._handle.onexit (child_process.js:791:34)
หากสองบรรทัดแรกยังคงอยู่
events.js:72
throw er; // Unhandled 'error' event
ทำขั้นตอนนี้อีกครั้งจนกว่าจะไม่ คุณต้องระบุผู้ฟังที่ส่งข้อผิดพลาดก่อนดำเนินการในขั้นตอนถัดไป
ขั้นตอนที่ 3: ตรวจสอบให้แน่ใจว่า$PATH
ได้ตั้งค่าตัวแปรสภาพแวดล้อมแล้ว
มีสองสถานการณ์ที่เป็นไปได้:
- คุณพึ่งพาเริ่มต้นพฤติกรรมเพื่อให้สภาพแวดล้อมกระบวนการเด็กจะเป็นเช่นเดียวกับ
spawn
process.env
- คุณกำลังส่งผ่าน
env
วัตถุไปspawn
ยังoptions
อาร์กิวเมนต์
ในทั้งสองสถานการณ์คุณต้องตรวจสอบPATH
คีย์บนวัตถุสภาพแวดล้อมที่จะใช้กระบวนการลูกที่เกิด
ตัวอย่างสำหรับสถานการณ์ 1
// inspect the PATH key on process.env
console.log( process.env.PATH );
spawn('some-command', ['--help']);
ตัวอย่างสำหรับสถานการณ์ที่ 2
var env = getEnvKeyValuePairsSomeHow();
// inspect the PATH key on the env object
console.log( env.PATH );
spawn('some-command', ['--help'], { env: env });
กรณีที่ไม่มีPATH
(เช่นนั้นundefined
) จะทำให้เกิดspawn
การปล่อยENOENT
ข้อผิดพลาดในขณะที่มันจะเป็นไปไม่ได้ที่จะหาใด ๆcommand
เว้นแต่จะเป็นเส้นทางที่แน่นอนไปยังแฟ้มที่ปฏิบัติการ
เมื่อPATH
ตั้งค่าไว้ถูกต้องแล้วให้ทำตามขั้นตอนต่อไป มันควรจะเป็นไดเรกทอรีหรือรายการไดเรกทอรี กรณีสุดท้ายเป็นเรื่องปกติ
ขั้นตอนที่ 4: ตรวจสอบให้แน่ใจว่าcommand
มีอยู่ในไดเรกทอรีของสิ่งที่กำหนดไว้PATH
วางไข่อาจปล่อยENOENT
ข้อผิดพลาดหากชื่อไฟล์command
(เช่น 'some-command') ไม่มีอยู่ในไดเรกทอรีที่กำหนดไว้อย่างน้อยหนึ่งPATH
รายการ
command
ค้นหาสถานที่ที่แน่นอนของ บน linux distributions ส่วนใหญ่สามารถทำได้จากเทอร์มินัลด้วยwhich
คำสั่ง มันจะบอกคุณเส้นทางที่แน่นอนไปยังไฟล์ปฏิบัติการ (เช่นด้านบน) หรือบอกว่ามันไม่พบ
ตัวอย่างการใช้งานซึ่งและเอาท์พุทเมื่อพบคำสั่ง
> which some-command
some-command is /usr/bin/some-command
ตัวอย่างการใช้งานซึ่งและเอาท์พุทเมื่อไม่พบคำสั่ง
> which some-command
bash: type: some-command: not found
โปรแกรมที่พลาดการติดตั้งเป็นสาเหตุที่พบบ่อยที่สุดสำหรับคำสั่งnot found อ้างถึงเอกสารคำสั่งแต่ละคำสั่งหากจำเป็นและติดตั้ง
PATH
เมื่อคำสั่งเป็นไฟล์สคริปต์ง่ายให้แน่ใจว่าจะสามารถเข้าถึงได้จากไดเรกทอรีบนที่ หากไม่ใช่ให้ย้ายไปที่ลิงก์ใดลิงก์หนึ่งหรือสร้างลิงก์ไปยังลิงก์นั้น
เมื่อคุณกำหนดPATH
อย่างถูกต้องและcommand
สามารถเข้าถึงได้จากนั้นคุณควรจะสามารถวางกระบวนการลูกของคุณโดยไม่spawn ENOENT
ถูกโยน
exec
แทนที่จะส่งผ่านคำสั่งเป็นอาร์กิวเมนต์แรกและตัวเลือกเป็น Array สำหรับอาร์กิวเมนต์ที่สอง เช่นผมทำแทนspawn( "adb logcat -c" )
spawn( "adb", [ "logcat", "-c" ] )