Étape 1: Assurez spawn
- vous que le nom est le bon
Tout d'abord, passez en revue les documents pour child_process.spawn (commande, arguments, options) :
Lance un nouveau processus avec la donnée command
, avec des arguments de ligne de commande dans args
. S'il est omis, par args
défaut , un tableau est vide.
Le troisième argument est utilisé pour spécifier des options supplémentaires, par défaut:
{ cwd: undefined, env: process.env }
Utilisez env
pour spécifier les variables d'environnement qui seront visibles par le nouveau processus, la valeur par défaut est process.env
.
Assurez-vous de ne pas insérer d'arguments de ligne de commande command
et que l' spawn
appel entier est valide . Passez à l'étape suivante.
Étape 2: identifier l'émetteur d'événements qui émet l'événement d'erreur
Recherche sur votre code source pour chaque appel à spawn
, ou child_process.spawn
, par exemple
spawn('some-command', [ '--help' ]);
et attachez-y un écouteur d'événement pour l'événement «erreur», afin que vous remarquiez l'émetteur d'événement exact qui le lance comme «non géré». Après le débogage, ce gestionnaire peut être supprimé.
spawn('some-command', [ '--help' ])
.on('error', function( err ){ throw err })
;
Exécutez et vous devriez obtenir le chemin du fichier et le numéro de ligne où votre écouteur "d'erreur" a été enregistré. Quelque chose comme:
/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)
Si les deux premières lignes sont toujours
events.js:72
throw er; // Unhandled 'error' event
recommencez cette étape jusqu'à ce qu'ils ne le soient pas. Vous devez identifier l'écouteur qui émet l'erreur avant de passer à l'étape suivante.
Étape 3: assurez-vous que la variable d'environnement $PATH
est définie
Il existe deux scénarios possibles:
- Vous comptez sur le
spawn
comportement par défaut , donc l'environnement de processus enfant sera le même que process.env
.
- Vous êtes explicitement en train de passer un
env
objet à spawn
l' options
argument.
Dans les deux scénarios, vous devez inspecter la PATH
clé de l'objet d'environnement que le processus enfant généré utilisera.
Exemple pour le scénario 1
// inspect the PATH key on process.env
console.log( process.env.PATH );
spawn('some-command', ['--help']);
Exemple pour le scénario 2
var env = getEnvKeyValuePairsSomeHow();
// inspect the PATH key on the env object
console.log( env.PATH );
spawn('some-command', ['--help'], { env: env });
L'absence de PATH
(c'est-à-dire, c'est undefined
) provoquera l'émission spawn
de l' ENOENT
erreur , car il ne sera pas possible de localiser tout command
sauf s'il s'agit d'un chemin absolu vers le fichier exécutable.
Lorsque PATH
est correctement réglé, passez à l'étape suivante. Il doit s'agir d'un répertoire ou d'une liste de répertoires. Le dernier cas est l'habituel.
Étape 4: Assurez-vous qu'il command
existe sur un répertoire de ceux définis dansPATH
Spawn peut émettre l' ENOENT
erreur si le nom de fichier command
(c'est-à-dire, 'some-command') n'existe pas dans au moins un des répertoires définis sur PATH
.
Localisez l'endroit exact de command
. Sur la plupart des distributions Linux, cela peut être fait à partir d'un terminal avec la which
commande. Il vous indiquera le chemin absolu vers le fichier exécutable (comme ci-dessus), ou dira s'il n'est pas trouvé.
Exemple d'utilisation de laquelle et de sa sortie lorsqu'une commande est trouvée
> which some-command
some-command is /usr/bin/some-command
Exemple d'utilisation de laquelle et de sa sortie lorsqu'une commande n'est pas trouvée
> which some-command
bash: type: some-command: not found
les programmes mal installés sont la cause la plus courante d'une commande introuvable . Reportez-vous à la documentation de chaque commande si nécessaire et installez-la.
Lorsque la commande est un simple fichier de script, assurez-vous qu'elle est accessible à partir d'un répertoire sur le PATH
. Si ce n'est pas le cas, déplacez-le vers l'un ou faites un lien vers celui-ci.
Une fois que vous avez déterminé qu'il PATH
est correctement défini et qu'il command
est accessible à partir de celui-ci, vous devriez pouvoir générer votre processus enfant sans spawn ENOENT
être jeté.
exec
au lieu de passer la commande comme premier argument et les options comme tableau pour le deuxième argument. par exemple, je faisaisspawn( "adb logcat -c" )
au lieu despawn( "adb", [ "logcat", "-c" ] )
.