Schritt 1: Stellen Sie sicher, dass spawn
richtig aufgerufen wird
Überprüfen Sie zuerst die Dokumentation für child_process.spawn( command, args, options ):
Startet einen neuen Prozess mit dem angegebenen command
und den Befehlszeilenargumenten in args
. Wenn weggelassen, ist args
standardmäßig ein leeres Array.
Das dritte Argument wird verwendet, um zusätzliche Optionen anzugeben, die standardmäßig sind:
{ cwd: undefined, env: process.env }
Verwenden Sie env
, um Umgebungsvariablen festzulegen, die für den neuen Prozess sichtbar sein sollen. Standardmäßig ist dies process.env
.
Vergewissern Sie sich, dass Sie keine Befehlszeilenargumente in command
eingeben und der gesamte spawn
-Aufruf gültig ist. Gehen Sie zum nächsten Schritt über.
Schritt 2: Identifizieren Sie den Ereignisemitter, der das Fehlerereignis auslöst
Durchsuchen Sie Ihren Quellcode nach jedem Aufruf von spawn
oder child_process.spawn
, z.B.
spawn('some-command', [ '--help' ]);
und fügen Sie dort einen Ereignislistener für das 'error'-Ereignis hinzu, damit Sie den genauen Ereignisemitter bemerken, der es als 'Unhandled' wirft. Nach dem Debuggen kann dieser Handler entfernt werden.
spawn('some-command', [ '--help' ])
.on('error', function( err ){ throw err })
;
Führen Sie den Code aus und Sie sollten den Dateipfad und die Zeilennummer erhalten, an der Ihr 'error'-Listener registriert wurde. Etwas Ähnliches wie:
/pfad/der/den/error/listener/registriert.js:29
throw err;
^
Error: spawn ENOENT
at errnoException (child_process.js:1000:11)
at Process.ChildProcess._handle.onexit (child_process.js:791:34)
Wenn die ersten beiden Zeilen immer noch
events.js:72
throw er; // Unhandled 'error' event
sein, führen Sie diesen Schritt erneut aus, bis sie es nicht mehr sind. Sie müssen den Listener identifizieren, der den Fehler auslöst, bevor Sie mit dem nächsten Schritt fortfahren.
Schritt 3: Stellen Sie sicher, dass die Umgebungsvariable $PATH
festgelegt ist
Es gibt zwei mögliche Szenarien:
- Sie verlassen sich auf das Standardverhalten von
spawn
, sodass die Umgebung des Kindprozesses die gleiche ist wie process.env
.
- Sie geben explizit ein
env
-Objekt an den spawn
-Aufruf im options
-Argument.
In beiden Szenarien müssen Sie den PATH
-Schlüssel im Umgebungsobjekt, das der gestartete Kindprozess verwenden wird, überprüfen.
Beispiel für Szenario 1
// Untersuchen Sie den PATH-Schlüssel auf process.env
console.log( process.env.PATH );
spawn('some-command', ['--help']);
Beispiel für Szenario 2
var env = getEnvKeyValuePairsSomeHow();
// Untersuchen Sie den PATH-Schlüssel im env-Objekt
console.log( env.PATH );
spawn('some-command', ['--help'], { env: env });
Das Fehlen von PATH
(d.h., es ist undefined
) wird dazu führen, dass spawn
den ENOENT
-Fehler auslöst, da es nicht möglich sein wird, irgendwelche command
zu lokalisieren, es sei denn, es handelt sich um einen absoluten Pfad zur ausführbaren Datei.
Wenn PATH
korrekt festgelegt ist, fahren Sie mit dem nächsten Schritt fort. Es sollte ein Verzeichnis oder eine Liste von Verzeichnissen sein. Der letzte Fall ist üblich.
Schritt 4: Stellen Sie sicher, dass command
in einem Verzeichnis existiert, das in PATH
definiert ist
Spawn kann den ENOENT
-Fehler auslösen, wenn der Dateiname command
(z.B. 'some-command') nicht in mindestens einem der in PATH
definierten Verzeichnisse existiert.
Ermitteln Sie den genauen Speicherort von command
. Bei den meisten Linux-Distributionen kann dies über ein Terminal mit dem Befehl which
erfolgen. Es wird Ihnen den absoluten Pfad zur ausführbaren Datei mitteilen (wie oben) oder angeben, dass sie nicht gefunden wurde.
Beispiel für die Verwendung von which und dessen Ausgabe, wenn ein Befehl gefunden wird
> which some-command
some-command ist /usr/bin/some-command
Beispiel für die Verwendung von which und dessen Ausgabe, wenn ein Befehl nicht gefunden wird
> which some-command
bash: type: some-command: nicht gefunden
Falsch installierte Programme sind die häufigste Ursache für einen Befehl, der als nicht gefunden markiert ist. Konsultieren Sie die Dokumentation jedes Befehls bei Bedarf und installieren Sie ihn.
Wenn der Befehl eine einfache Skriptdatei ist, stellen Sie sicher, dass er von einem Verzeichnis auf dem PATH
aus zugänglich ist. Wenn nicht, bewegen Sie ihn dorthin oder erstellen Sie eine Verknüpfung dazu.
Wenn Sie feststellen, dass PATH
korrekt festgelegt ist und command
davon aus zugänglich ist, sollte es möglich sein, Ihren Kindprozess ohne das Werfen von ENONT
zu starten.