nodejs / nodejs/node

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

Offen
#51,018 6 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

Vorherrschende Sprache
JavaScript
Sterne
122k
Forks
37.3k
Ø Merge
4 T. 2 Std.
Gemergte PRs (30 T.)
283

Beschreibung

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.

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Beginne am Einstiegspunkt child_process.spawn und reproduziere den Windows-Fall mit test-detached.js und test-detached.ps1 unter Verwendung von detached: true und stdio: 'ignore'. Vergleiche das funktionierende node-Kind mit dem fehlschlagenden pwsh-Kind und verfolge die Behandlung getrennter Prozesse unter Windows. Als abgeschlossen gilt die Aufgabe, wenn pwsh unabhängig läuft und from-pwsh.txt erstellt, während der Elternprozess beendet wird, ohne zu warten.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
javascript, node.js, powershell
Bereich
backend, operating-systems
Issue-Typ
Bug
Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Aktivitätsstatus
Ruhig
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
45/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.