Шаг 1: Убедитесь, что spawn
это правильный путь
Сначала просмотрите документы для child_process.spawn (команда, аргументы, параметры) :
Запускает новый процесс с заданными command
аргументами командной строки в args
. Если опущено, по args
умолчанию используется пустой массив.
Третий аргумент используется для указания дополнительных параметров, которые по умолчанию:
{ cwd: undefined, env: process.env }
Используется env
для указания переменных среды, которые будут видны новому процессу, по умолчанию process.env
.
Убедитесь, что вы не вводите никаких аргументов командной строки, command
и весь spawn
вызов действителен . Перейдите к следующему шагу.
Шаг 2. Определите источник событий, который генерирует событие ошибки
Поиск по исходному коду для каждого звонка spawn
или child_process.spawn
, т. Е.
spawn('some-command', [ '--help' ]);
и прикрепите туда прослушиватель событий для события error, чтобы вы точно заметили Emitter, который выбрасывает его как «Unhandled». После отладки этот обработчик может быть удален.
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
Spawn может выдать ENOENT
ошибку, если имя файла command
(то есть 'some-command') не существует хотя бы в одном из каталогов, определенных в PATH
.
Найдите точное место command
. В большинстве дистрибутивов Linux это можно сделать из терминала с помощью which
команды. Он скажет вам абсолютный путь к исполняемому файлу (как выше), или скажет, если он не найден.
Пример использования которого и его вывод, когда команда найдена
> which some-command
some-command is /usr/bin/some-command
Пример использования которого и его вывод, когда команда не найдена
> which some-command
bash: type: some-command: not found
неправильно установленные программы являются наиболее частой причиной не найденной команды. При необходимости обратитесь к документации по каждой команде и установите ее.
Когда команда представляет собой простой файл сценария, убедитесь, что он доступен из каталога на PATH
. Если это не так, либо переместите его к одному, либо сделайте ссылку на него.
Как только вы определите, что PATH
он правильно настроен и command
доступен из него, вы сможете создавать дочерний процесс, не spawn ENOENT
вызывая его.
exec
вместо того, чтобы передавать команду в качестве первого аргумента и параметры в качестве массива для второго аргумента. например, я делалspawn( "adb logcat -c" )
вместоspawn( "adb", [ "logcat", "-c" ] )
.