Krok 1: Upewnij spawn
się, że nazywa się właściwą drogę
Najpierw przejrzyj dokumentację child_process.spawn (polecenie, argumenty, opcje) :
Uruchamia nowy proces z podanym command
argumentem wiersza poleceń w args
. Jeśli zostanie pominięty, args
domyślnie jest pusta tablica.
Trzeci argument służy do określenia dodatkowych opcji, które domyślnie:
{ cwd: undefined, env: process.env }
Służy env
do określania zmiennych środowiskowych, które będą widoczne dla nowego procesu, domyślnie jest to process.env
.
Upewnij się, że nie wstawiasz żadnych argumentów wiersza poleceń, command
a całe spawn
wywołanie jest prawidłowe . Przejdź do następnego kroku.
Krok 2: Zidentyfikuj emiter zdarzeń, który emituje zdarzenie błędu
Wyszukaj w kodzie źródłowym każde połączenie do spawn
lub child_process.spawn
, tj
spawn('some-command', [ '--help' ]);
i dołącz tam detektor zdarzeń dla zdarzenia „błąd”, abyś zauważył dokładny emiter zdarzeń, który wyrzuca go jako „nieobsługiwany”. Po debugowaniu ten program obsługi można usunąć.
spawn('some-command', [ '--help' ])
.on('error', function( err ){ throw err })
;
Wykonaj, a powinieneś uzyskać ścieżkę do pliku i numer wiersza, w którym zarejestrowany został Twój detektor błędu. Coś jak:
/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)
Jeśli pierwsze dwie linie są nadal
events.js:72
throw er; // Unhandled 'error' event
wykonaj ten krok ponownie, dopóki nie będą. Przed przejściem do następnego kroku musisz zidentyfikować nasłuchującego, który emituje błąd.
Krok 3: Upewnij się, że zmienna środowiskowa $PATH
jest ustawiona
Istnieją dwa możliwe scenariusze:
- Polegasz na domyślnym
spawn
zachowaniu, więc środowisko procesów potomnych będzie takie samo jak process.env
.
- Jesteś explicity przechodzącą
env
obiektu do spawn
na options
argument.
W obu scenariuszach należy sprawdzić PATH
klucz obiektu środowiskowego, którego będzie używał odrodzony proces potomny.
Przykład dla scenariusza 1
// inspect the PATH key on process.env
console.log( process.env.PATH );
spawn('some-command', ['--help']);
Przykład dla scenariusza 2
var env = getEnvKeyValuePairsSomeHow();
// inspect the PATH key on the env object
console.log( env.PATH );
spawn('some-command', ['--help'], { env: env });
Brak PATH
(tj. Jest undefined
) spowoduje spawn
wyświetlenie ENOENT
błędu , ponieważ nie będzie można go zlokalizować, command
chyba że będzie to bezwzględna ścieżka do pliku wykonywalnego.
Po PATH
prawidłowym ustawieniu przejdź do następnego kroku. Powinien to być katalog lub lista katalogów. Ostatni przypadek jest zwykły.
Krok 4: Upewnij się, że command
istnieje katalog w katalogu zdefiniowanym wPATH
Odrodzenie może wyemitować ENOENT
błąd, jeśli nazwa pliku command
(tj. „Jakieś polecenie”) nie istnieje w co najmniej jednym z katalogów zdefiniowanych w PATH
.
Znajdź dokładne miejsce command
. W większości dystrybucji Linuksa można to zrobić z terminala za pomocą which
polecenia. Powie ci bezwzględną ścieżkę do pliku wykonywalnego (jak wyżej) lub powie, czy go nie znaleziono.
Przykład użycia tego i jego wyniku po znalezieniu polecenia
> which some-command
some-command is /usr/bin/some-command
Przykład użycia tego i jego wyniku, gdy nie znaleziono polecenia
> which some-command
bash: type: some-command: not found
źle zainstalowane programy są najczęstszą przyczyną nieznalezienia polecenia. W razie potrzeby zapoznaj się z dokumentacją każdego polecenia i zainstaluj ją.
Gdy polecenie jest prostym plikiem skryptu, upewnij się, że jest dostępny z katalogu w PATH
. Jeśli nie, przenieś go do jednego lub stwórz link do niego.
Po ustaleniu, że PATH
jest poprawnie ustawiony i command
dostępny z niego, powinieneś być w stanie odrodzić proces potomny bez spawn ENOENT
rzucania.
exec
zamiast przekazać polecenie jako pierwszy argument, a opcje jako tablicę dla drugiego argumentu. np. robiłemspawn( "adb logcat -c" )
zamiastspawn( "adb", [ "logcat", "-c" ] )
.