Etapa 1: verifique se spawn
é chamado o caminho certo
Primeiro, revise os documentos para child_process.spawn (command, args, options) :
Inicia um novo processo com o dado command
, com argumentos de linha de comando em args
. Se omitido, o args
padrão é uma matriz vazia.
O terceiro argumento é usado para especificar opções adicionais, cujo padrão é:
{ cwd: undefined, env: process.env }
Use env
para especificar variáveis de ambiente que serão visíveis para o novo processo, o padrão é process.env
.
Verifique se você não está colocando argumentos de linha de comando command
e se toda a spawn
chamada é válida . Prossiga para a próxima etapa.
Etapa 2: identificar o emissor do evento que emite o evento de erro
Pesquise no seu código-fonte cada chamada para spawn
, ou child_process.spawn
, ie
spawn('some-command', [ '--help' ]);
e anexe lá um ouvinte de evento para o evento 'error', para que você seja notado exatamente o emissor do evento que está lançando-o como 'Unhandled'. Após a depuração, esse manipulador pode ser removido.
spawn('some-command', [ '--help' ])
.on('error', function( err ){ throw err })
;
Execute e você deve obter o caminho do arquivo e o número da linha em que o ouvinte 'erro' foi registrado. Algo como:
/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 as duas primeiras linhas ainda estiverem
events.js:72
throw er; // Unhandled 'error' event
faça este passo novamente até que não estejam. Você deve identificar o ouvinte que emite o erro antes de prosseguir na próxima etapa.
Etapa 3: verifique se a variável de ambiente $PATH
está definida
Existem dois cenários possíveis:
- Você confia no
spawn
comportamento padrão , portanto, o ambiente do processo filho será o mesmo que process.env
.
- Você está explicitamente passando um
env
objeto para spawn
o options
argumento.
Nos dois cenários, você deve inspecionar a PATH
chave no objeto de ambiente que o processo filho gerado usará.
Exemplo para o cenário 1
// inspect the PATH key on process.env
console.log( process.env.PATH );
spawn('some-command', ['--help']);
Exemplo para o cenário 2
var env = getEnvKeyValuePairsSomeHow();
// inspect the PATH key on the env object
console.log( env.PATH );
spawn('some-command', ['--help'], { env: env });
A ausência de PATH
(ou seja, é undefined
) causará spawn
o ENOENT
erro , pois não será possível localizar nenhum, a command
menos que seja um caminho absoluto para o arquivo executável.
Quando PATH
estiver definido corretamente, prossiga para a próxima etapa. Deve ser um diretório ou uma lista de diretórios. O último caso é o habitual.
Etapa 4: verifique se command
existe em um diretório daqueles definidos emPATH
O spawn pode emitir o ENOENT
erro se o nome do arquivo command
(por exemplo, 'algum comando') não existir em pelo menos um dos diretórios definidos em PATH
.
Localize o local exato de command
. Na maioria das distribuições linux, isso pode ser feito a partir de um terminal com o which
comando Ele informará o caminho absoluto para o arquivo executável (como acima), ou informará se ele não foi encontrado.
Exemplo de uso de qual e sua saída quando um comando é encontrado
> which some-command
some-command is /usr/bin/some-command
Exemplo de uso de qual e sua saída quando um comando não for encontrado
> which some-command
bash: type: some-command: not found
programas instalados com falta são a causa mais comum de um comando não encontrado . Consulte a documentação de cada comando, se necessário, e instale-o.
Quando o comando é um arquivo de script simples, verifique se ele é acessível a partir de um diretório no PATH
. Caso contrário, mova-o para um ou faça um link para ele.
Depois de determinar que PATH
está definido corretamente e command
é acessível a partir dele, você poderá gerar o processo filho sem spawn ENOENT
ser jogado.
exec
vez de passar o comando como o primeiro argumento e as opções como uma Matriz para o segundo argumento. por exemplo, eu estava fazendo emspawn( "adb logcat -c" )
vez despawn( "adb", [ "logcat", "-c" ] )
.