node-pty
node-pty copied to clipboard
Parent processes (winpty-agent.exe, etc.) do not exit when shell process exits by itself
Environment details
- OS: Windows 10 Pro 64bit
- OS version: Windows 10 Pro 64bit Version 1809 (OS Build 17763.615)
- node-pty version: 0.9.0-beta19
Issue description
If a shell process suicides, its parent processes (not including the main node.js process) will not exit automatically unless pty.kill()
is called. Check the following issue reproducing code:
import { spawn } from 'node-pty'
import * as os from 'os'
function getUserHome() {
return process.env[process.platform == 'win32' ? 'USERPROFILE' : 'HOME']
}
function getShell() {
switch (os.platform()) {
case 'win32': return process.env.ComSpec || 'cmd.exe'
case 'android': return '/bin/sh'
default: return '/bin/bash'
}
}
function createProcess({ cols, rows }: { cols?: number, rows?: number } = { cols: 80, rows: 30 }) {
const shell = getShell()
return spawn(shell, [], {
name: 'xterm-color',
cols: cols || 80,
rows: rows || 30,
cwd: getUserHome(),
env: process.env as { [key: string]: string },
experimentalUseConpty: true
})
}
function sleep(n): Promise<void> {
return new Promise(res => setTimeout(res, n))
}
async function main() {
await sleep(10 * 1000)
for(let i = 0; i < 10; i++) {
const pty = createProcess()
console.log(pty.pid)
await sleep(1000)
pty.write('exit\r')
}
await sleep(60 * 1000)
}
main()
The code above creates 10 winpty-agent.exe
s and 10 conhost.exe
. However, node-pty
has notified user that those shell processes has exited by emitting exit
event, misleading users that the process has exited cleanly.
It seems that there is no graceful way to determine whether the process is killed by calling pty.kill()
or exited by itself (and therefore we should call pty.kill()
inside the onExit
handler). However, invoking pty.kill()
twice on the same process will raise error (can be caught though).
@Tyriar any news in addressing this issue? We end up with hundreds of winpty-agent.exe processes ...
@Tyriar any news in addressing this issue? We end up with hundreds of winpty-agent.exe processes ...
@gpetrov Are you using node-pty
itself or VSCode? If you are using node-pty
and have control on the PTY object, you can always call pty.kill()
in onExit
handler (note that pty.kill
will throw an error if the group of processes has already been killed).
@Luluno01 Yes I went indeed for pty.kill() onExit for now - this helps indeed. It just didn't seem like a neat solution but it does the job for now.
And no we have a different project using node-pty and not VSCode