Passaggio 1: assicurarsi che spawn
sia chiamato nel modo giusto
Innanzitutto, esamina i documenti per child_process.spawn (comando, args, opzioni) :
Avvia un nuovo processo con il dato command
, con gli argomenti della riga di comando in args
. Se omesso, viene args
impostato automaticamente un array vuoto.
Il terzo argomento viene utilizzato per specificare ulteriori opzioni, che per impostazione predefinita è:
{ cwd: undefined, env: process.env }
Utilizzare env
per specificare le variabili di ambiente che saranno visibili al nuovo processo, l'impostazione predefinita è process.env
.
Assicurati di non inserire argomenti da riga di comando command
e che l'intera spawn
chiamata sia valida . Procedere con il passaggio successivo.
Passaggio 2: identificare l'Emettitore di eventi che emette l'evento di errore
Cerca nel tuo codice sorgente ogni chiamata a spawn
, o child_process.spawn
, ad es
spawn('some-command', [ '--help' ]);
e allega un listener di eventi per l'evento "errore", così noterai l'esatto Emettitore di eventi che lo sta lanciando come "Non gestito". Dopo il debug, quel gestore può essere rimosso.
spawn('some-command', [ '--help' ])
.on('error', function( err ){ throw err })
;
Eseguire e si dovrebbe ottenere il percorso del file e il numero di riga in cui è stato registrato il listener "errore". Qualcosa di simile a:
/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)
Se le prime due righe sono ferme
events.js:72
throw er; // Unhandled 'error' event
ripetere questo passaggio fino a quando non lo sono. È necessario identificare il listener che emette l'errore prima di procedere con il passaggio successivo.
Passaggio 3: assicurarsi che la variabile di ambiente $PATH
sia impostata
Esistono due possibili scenari:
- Ti affidi al
spawn
comportamento predefinito , quindi l'ambiente di processo figlio sarà lo stesso di process.env
.
- Sei esplicitamente passaggio di un
env
oggetto spawn
sulla options
tesi.
In entrambi gli scenari, è necessario ispezionare la PATH
chiave sull'oggetto ambiente che verrà utilizzata dal processo figlio generato.
Esempio per lo scenario 1
// inspect the PATH key on process.env
console.log( process.env.PATH );
spawn('some-command', ['--help']);
Esempio per lo scenario 2
var env = getEnvKeyValuePairsSomeHow();
// inspect the PATH key on the env object
console.log( env.PATH );
spawn('some-command', ['--help'], { env: env });
L'assenza di PATH
(cioè, è undefined
) causerà spawn
l'emissione ENOENT
dell'errore , in quanto non sarà possibile individuarne uno a command
meno che non sia un percorso assoluto per il file eseguibile.
Quando PATH
è impostato correttamente, procedere al passaggio successivo. Dovrebbe essere una directory o un elenco di directory. L'ultimo caso è il solito.
Passaggio 4: assicurarsi che command
esista in una directory di quelli definiti inPATH
Spawn può emettere l' ENOENT
errore se il nome file command
(ovvero, 'some-command') non esiste in almeno una delle directory definite PATH
.
Individua il luogo esatto di command
. Sulla maggior parte delle distribuzioni di Linux, questo può essere fatto da un terminale con il which
comando. Ti dirà il percorso assoluto del file eseguibile (come sopra) o dirà se non è stato trovato.
Esempio di utilizzo di quale e il suo output quando viene trovato un comando
> which some-command
some-command is /usr/bin/some-command
Esempio di utilizzo di quale e il suo output quando non viene trovato un comando
> which some-command
bash: type: some-command: not found
i programmi installati per errore sono la causa più comune di un comando non trovato . Fare riferimento alla documentazione di ciascun comando, se necessario, e installarlo.
Quando il comando è un semplice file di script, assicurarsi che sia accessibile da una directory sul PATH
. In caso contrario, spostalo su uno o creane un collegamento.
Una volta stabilito che PATH
è impostato correttamente e command
accessibile da esso, dovresti essere in grado di spawnare il processo figlio senza spawn ENOENT
essere lanciato.
exec
invece di passare il comando come primo argomento e le opzioni come matrice per il secondo argomento. ad es. stavo facendospawn( "adb logcat -c" )
invece dispawn( "adb", [ "logcat", "-c" ] )
.