Шаг 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" ] ).