nodejs / nodejs/node

Under Windows, spawning a `pwsh` child process using `spawn` and `detached: true` does not work

Ouverte
#51,018 6 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

Langage dominant
JavaScript
Étoiles
122k
Forks
37.4k
Merge moyen
4 j 3 h
PR mergées (30 j)
272

Description

Version

v20.9.0

Platform

Microsoft Windows NT 10.0.22621.0 x64

Subsystem

child_process

What steps will reproduce the bug?

With this Node.js program:

import {spawn} from 'node:child_process';

const timer = `Running program`;
console.time(timer);
process.on('exit', () => console.timeEnd(timer));

const options = {
	detached: true, stdio: 'ignore', // try commenting to see both sub processes work but not being detached
};
const procNode = spawn('node', ['test-detached.js'], options); procNode.unref(); // always works
const procPwsh = spawn('pwsh', ['-File', 'test-detached.ps1'], options); procPwsh.unref(); // fails when detached: true

and those files next to it:

test-detached.js

import {writeFile} from 'node:fs/promises';
import {setTimeout} from 'node:timers/promises';

await setTimeout(2000);
await writeFile('from-node.txt', 'Hello from Node.js');

test-detached.ps1

Start-Sleep -Seconds 2
'Hello from PowerShell (pwsh)' > ./from-pwsh.txt

You can see that when activating the detached option, only from-node.txt is generated (after 2 seconds), and the parent program indeed doesn't wait for the child processes to complete.

If you deactivate that option, you can see both files from-node.txt and from-pwsh.txt appear, but the parent process waits (around 2 seconds + overhead).

How often does it reproduce? Is there a required condition?

It always happens.

What is the expected behavior? Why is that the expected behavior?

The PowerShell execution should go through.

What do you see instead?

The PowerShell execution does not go through.

Additional information

I am a bit clueless here. Given the fact it works with node.exe but doesn't with pwsh.exe, it is clearly contextual.

Either Node.js should handle such cases automatically, or it should open its API more to allow fine tuning the spawn configuration to make such cases work. I am really wondering what PowerShell does/expects to have the process fail.

Note that according to one of the comments on this thread on StackOverflow, it seems to be an issue on Windows only. So maybe indeed a need to adjust the use of Windows APIs...

I may push my investigation further and post updates here. For instance I'll try the same test from Python. I'll also double check on Linux.

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Piste de recherche

Commencez au point d’entrée child_process.spawn et reproduisez le cas Windows avec test-detached.js et test-detached.ps1 en utilisant detached: true et stdio: 'ignore'. Comparez le processus enfant node qui fonctionne avec le processus enfant pwsh qui échoue et suivez la gestion des processus détachés sous Windows. C’est terminé lorsque pwsh s’exécute indépendamment et crée from-pwsh.txt, tandis que le processus parent se termine sans attendre.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
javascript, node.js, powershell
Domaine
backend, operating-systems
Type d'issue
Bug
Difficulté
4/5
Temps estimé
3-5 jours
Activité
Calme
Clarté
Plutôt claire
Accessibilité débutants
45/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.