Крок 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" ] ).