Langkah 1: Pastikan spawn
disebut dengan cara yang benar
Pertama, tinjau dokumen untuk child_process.spawn (perintah, args, opsi) :
Meluncurkan proses baru dengan yang diberikan command
, dengan argumen baris perintah di args
. Jika dihilangkan,args
default ke Array kosong.
Argumen ketiga digunakan untuk menentukan opsi tambahan, yang secara default adalah:
{ cwd: undefined, env: process.env }
Gunakan env
untuk menentukan variabel lingkungan yang akan terlihat oleh proses baru, standarnya adalah process.env
.
Pastikan Anda tidak memasukkan argumen baris perintah apa pun command
dan seluruh spawn
panggilan itu valid . Lanjutkan ke langkah selanjutnya.
Langkah 2: Identifikasi Emitor Peristiwa yang memancarkan peristiwa kesalahan
Cari pada kode sumber Anda untuk setiap panggilan ke spawn
, atau child_process.spawn
, yaitu
spawn('some-command', [ '--help' ]);
dan lampirkan di sana pendengar acara untuk acara 'kesalahan', sehingga Anda dapat mengetahui Peristiwa Emitor yang tepat yang melemparkannya sebagai 'Tidak Ditangani'. Setelah debugging, pawang itu dapat dihapus.
spawn('some-command', [ '--help' ])
.on('error', function( err ){ throw err })
;
Jalankan dan Anda harus mendapatkan jalur file dan nomor baris tempat pendaftar 'kesalahan' Anda terdaftar. Sesuatu seperti:
/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)
Jika dua baris pertama masih
events.js:72
throw er; // Unhandled 'error' event
lakukan langkah ini lagi sampai tidak. Anda harus mengidentifikasi pendengar yang memancarkan kesalahan sebelum melanjutkan ke langkah berikutnya.
Langkah 3: Pastikan variabel lingkungan $PATH
diatur
Ada dua skenario yang mungkin:
- Anda mengandalkan
spawn
perilaku default , sehingga lingkungan proses anak akan sama dengan process.env
.
- Anda explicity melewati sebuah
env
objek untuk spawn
di options
argumen.
Dalam kedua skenario, Anda harus memeriksa PATH
kunci pada objek lingkungan yang akan digunakan proses anak yang dilahirkan.
Contoh untuk skenario 1
// inspect the PATH key on process.env
console.log( process.env.PATH );
spawn('some-command', ['--help']);
Contoh untuk skenario 2
var env = getEnvKeyValuePairsSomeHow();
// inspect the PATH key on the env object
console.log( env.PATH );
spawn('some-command', ['--help'], { env: env });
Tidak adanya PATH
(yaitu, itu undefined
) akan menyebabkan spawn
memancarkan ENOENT
kesalahan , karena itu tidak akan mungkin untuk menemukan apa pun command
kecuali itu adalah jalur absolut ke file yang dapat dieksekusi.
Ketika PATH
diatur dengan benar, lanjutkan ke langkah berikutnya. Itu harus berupa direktori, atau daftar direktori. Kasus terakhir adalah biasa.
Langkah 4: Pastikan command
ada di direktori yang ditentukan dalamPATH
Bibit dapat memancarkan ENOENT
kesalahan jika nama file command
(yaitu, 'beberapa perintah') tidak ada di setidaknya satu direktori yang ditentukan PATH
.
Temukan tempat yang tepat dari command
. Pada kebanyakan distribusi linux, ini dapat dilakukan dari terminal dengan which
perintah. Ini akan memberi tahu Anda jalur absolut ke file yang dapat dieksekusi (seperti di atas), atau memberi tahu jika itu tidak ditemukan.
Contoh penggunaan yang mana dan hasilnya ketika suatu perintah ditemukan
> which some-command
some-command is /usr/bin/some-command
Contoh penggunaan yang mana dan hasilnya ketika suatu perintah tidak ditemukan
> which some-command
bash: type: some-command: not found
program yang salah pasang adalah penyebab paling umum untuk perintah yang tidak ditemukan .Lihat setiap dokumentasi perintah jika perlu dan pasang.
Ketika perintah adalah file skrip sederhana memastikan itu dapat diakses dari direktori di PATH
. Jika tidak, pindahkan ke salah satu atau buat tautan ke sana.
Setelah Anda menentukan PATH
diatur dengan benar dan command
dapat diakses dari itu, Anda harus dapat menelurkan proses anak Anda tanpa spawn ENOENT
dilemparkan.
exec
bukannya meneruskan perintah sebagai argumen pertama dan opsi sebagai Array untuk argumen kedua. misal sayaspawn( "adb logcat -c" )
malah melakukanspawn( "adb", [ "logcat", "-c" ] )
.