Крок 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' ]);
і підключіть туди слухача події для події "помилка", тож ви помітите точного випромінювача події, який кидає його як "Нерозроблений". Після налагодження цей обробник можна буде видалити.
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
Нерест може видавати ENOENT
помилку, якщо ім'я файлу 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
а не команду як перший аргумент, а параметри як Array для другого аргументу. наприклад, я робивspawn( "adb logcat -c" )
замість цьогоspawn( "adb", [ "logcat", "-c" ] )
.