Passaggio 1: assicurarsi che spawnsia 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 argsimpostato automaticamente un array vuoto.
Il terzo argomento viene utilizzato per specificare ulteriori opzioni, che per impostazione predefinita è:
{ cwd: undefined, env: process.env }
Utilizzare envper 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 commande che l'intera spawnchiamata 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 $PATHsia impostata
Esistono due possibili scenari:
- Ti affidi al
spawncomportamento predefinito , quindi l'ambiente di processo figlio sarà lo stesso di process.env.
- Sei esplicitamente passaggio di un
envoggetto spawnsulla optionstesi.
In entrambi gli scenari, è necessario ispezionare la PATHchiave 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à spawnl'emissione ENOENTdell'errore , in quanto non sarà possibile individuarne uno a commandmeno 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 commandesista in una directory di quelli definiti inPATH
Spawn può emettere l' ENOENTerrore 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 whichcomando. 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 commandaccessibile da esso, dovresti essere in grado di spawnare il processo figlio senza spawn ENOENTessere lanciato.
execinvece 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" ] ).