vscode-eslint: Bug: "Launching server using runtime node failed. Error: spawn node ENOENT"

Type: Bug

At times when starting VS Code the ESLint server is stopped. It happens intermittently and quite seldom. Using the command ESLint: Restart ESLint Server does not help. Here is the output from the OUTPUT panel.

[Info  - 11:21:39 AM] ESLint server is starting
[Info  - 11:21:40 AM] ESLint server stopped.
[Error - 11:21:40 AM] ESLint client: couldn't create connection to server.
Launching server using runtime node failed. Error: spawn node ENOENT
[Error - 11:21:40 AM] Starting the server failed.
Launching server using runtime node failed. Error: spawn node ENOENT

### Here I executed the command 'ESLint: Restart ESLint Server' from the command palette ###

[Error - 11:23:15 AM] Restarting client failed
Error: Client is not running and can't be stopped. It's current state is: startFailed
	at w.shutdown (/home/userA/.vscode-server/extensions/dbaeumer.vscode-eslint-2.2.6/client/out/extension.js:1:107590)
	at w.stop (/home/userA/.vscode-server/extensions/dbaeumer.vscode-eslint-2.2.6/client/out/extension.js:1:107171)
	at w.stop (/home/userA/.vscode-server/extensions/dbaeumer.vscode-eslint-2.2.6/client/out/extension.js:1:266246)
	at w.restart (/home/userA/.vscode-server/extensions/dbaeumer.vscode-eslint-2.2.6/client/out/extension.js:1:266113)
	at /home/userA/.vscode-server/extensions/dbaeumer.vscode-eslint-2.2.6/client/out/extension.js:1:376159
	at s.h (/home/userA/.vscode-server/bin/97dec172d3256f8ca4bfb2143f3f76b503ca0534/out/vs/workbench/api/node/extensionHostProcess.js:94:107622)
	at s.$executeContributedCommand (/home/userA/.vscode-server/bin/97dec172d3256f8ca4bfb2143f3f76b503ca0534/out/vs/workbench/api/node/extensionHostProcess.js:94:108311)
	at u.N (/home/userA/.vscode-server/bin/97dec172d3256f8ca4bfb2143f3f76b503ca0534/out/vs/workbench/api/node/extensionHostProcess.js:104:11208)
	at u.M (/home/userA/.vscode-server/bin/97dec172d3256f8ca4bfb2143f3f76b503ca0534/out/vs/workbench/api/node/extensionHostProcess.js:104:10926)
	at u.H (/home/userA/.vscode-server/bin/97dec172d3256f8ca4bfb2143f3f76b503ca0534/out/vs/workbench/api/node/extensionHostProcess.js:104:10019)
	at u.G (/home/userA/.vscode-server/bin/97dec172d3256f8ca4bfb2143f3f76b503ca0534/out/vs/workbench/api/node/extensionHostProcess.js:104:9000)
	at /home/userA/.vscode-server/bin/97dec172d3256f8ca4bfb2143f3f76b503ca0534/out/vs/workbench/api/node/extensionHostProcess.js:104:7788
	at d.invoke (/home/userA/.vscode-server/bin/97dec172d3256f8ca4bfb2143f3f76b503ca0534/out/vs/workbench/api/node/extensionHostProcess.js:63:145)
	at v.deliver (/home/userA/.vscode-server/bin/97dec172d3256f8ca4bfb2143f3f76b503ca0534/out/vs/workbench/api/node/extensionHostProcess.js:63:2029)
	at g.fire (/home/userA/.vscode-server/bin/97dec172d3256f8ca4bfb2143f3f76b503ca0534/out/vs/workbench/api/node/extensionHostProcess.js:63:1667)
	at h.fire (/home/userA/.vscode-server/bin/97dec172d3256f8ca4bfb2143f3f76b503ca0534/out/vs/workbench/api/node/extensionHostProcess.js:72:14314)
	at /home/userA/.vscode-server/bin/97dec172d3256f8ca4bfb2143f3f76b503ca0534/out/vs/workbench/api/node/extensionHostProcess.js:120:15804
	at d.invoke (/home/userA/.vscode-server/bin/97dec172d3256f8ca4bfb2143f3f76b503ca0534/out/vs/workbench/api/node/extensionHostProcess.js:63:145)
	at v.deliver (/home/userA/.vscode-server/bin/97dec172d3256f8ca4bfb2143f3f76b503ca0534/out/vs/workbench/api/node/extensionHostProcess.js:63:2029)
	at g.fire (/home/userA/.vscode-server/bin/97dec172d3256f8ca4bfb2143f3f76b503ca0534/out/vs/workbench/api/node/extensionHostProcess.js:63:1667)
	at h.fire (/home/userA/.vscode-server/bin/97dec172d3256f8ca4bfb2143f3f76b503ca0534/out/vs/workbench/api/node/extensionHostProcess.js:72:14314)
	at c.y (/home/userA/.vscode-server/bin/97dec172d3256f8ca4bfb2143f3f76b503ca0534/out/vs/workbench/api/node/extensionHostProcess.js:72:17324)
	at /home/userA/.vscode-server/bin/97dec172d3256f8ca4bfb2143f3f76b503ca0534/out/vs/workbench/api/node/extensionHostProcess.js:72:15795
	at d.invoke (/home/userA/.vscode-server/bin/97dec172d3256f8ca4bfb2143f3f76b503ca0534/out/vs/workbench/api/node/extensionHostProcess.js:63:145)
	at v.deliver (/home/userA/.vscode-server/bin/97dec172d3256f8ca4bfb2143f3f76b503ca0534/out/vs/workbench/api/node/extensionHostProcess.js:63:2029)
	at g.fire (/home/userA/.vscode-server/bin/97dec172d3256f8ca4bfb2143f3f76b503ca0534/out/vs/workbench/api/node/extensionHostProcess.js:63:1667)
	at g.acceptChunk (/home/userA/.vscode-server/bin/97dec172d3256f8ca4bfb2143f3f76b503ca0534/out/vs/workbench/api/node/extensionHostProcess.js:72:12045)
	at /home/userA/.vscode-server/bin/97dec172d3256f8ca4bfb2143f3f76b503ca0534/out/vs/workbench/api/node/extensionHostProcess.js:72:11332
	at d.invoke (/home/userA/.vscode-server/bin/97dec172d3256f8ca4bfb2143f3f76b503ca0534/out/vs/workbench/api/node/extensionHostProcess.js:63:145)
	at v.deliver (/home/userA/.vscode-server/bin/97dec172d3256f8ca4bfb2143f3f76b503ca0534/out/vs/workbench/api/node/extensionHostProcess.js:63:2029)
	at g.fire (/home/userA/.vscode-server/bin/97dec172d3256f8ca4bfb2143f3f76b503ca0534/out/vs/workbench/api/node/extensionHostProcess.js:63:1667)
	at g.t (/home/userA/.vscode-server/bin/97dec172d3256f8ca4bfb2143f3f76b503ca0534/out/vs/workbench/api/node/extensionHostProcess.js:72:25895)

Using the terminal, node does exist:

> node --version
v18.12.1
> which node
/home/userA/.local/share/nvm/v18.12.1/bin/node

I have set "eslint.runtime": "node", both in the user and workspace settings.json files.

I have no idea what could be wrong. I have been using the ESLint extension for years, but this started to happen more recently within the past few months.

Extension version: 2.2.6 VS Code version: Code 1.74.3 (97dec172d3256f8ca4bfb2143f3f76b503ca0534, 2023-01-09T16:59:02.252Z) OS version: Windows_NT x64 10.0.19044 Modes: Sandboxed: No Remote OS version: Linux x64 5.4.0-137-generic

System Info
Item Value
CPUs 11th Gen Intel® Core™ i5-1145G7 @ 2.60GHz (8 x 2611)
GPU Status 2d_canvas: enabled
canvas_oop_rasterization: disabled_off
direct_rendering_display_compositor: disabled_off_ok
gpu_compositing: enabled
multiple_raster_threads: enabled_on
opengl: enabled_on
rasterization: enabled
raw_draw: disabled_off_ok
skia_renderer: enabled_on
video_decode: enabled
video_encode: enabled
vulkan: disabled_off
webgl: enabled
webgl2: enabled
webgpu: disabled_off
Load (avg) undefined
Memory (System) 31.69GB (18.23GB free)
Process Argv –crash-reporter-id e332dab4-91ea-49d1-8a1f-d8f6e06fa4e1
Screen Reader no
VM 0%
Item Value
Remote SSH: vm
OS Linux x64 5.4.0-137-generic
CPUs Intel® Xeon® Gold 6148 CPU @ 2.40GHz (8 x 2394)
Memory (System) 31.33GB (27.66GB free)
VM 18%
A/B Experiments
vsliv368:30146709
vsreu685:30147344
python383:30185418
vspor879:30202332
vspor708:30202333
vspor363:30204092
vstes627:30244334
vslsvsres303:30308271
pythonvspyl392:30443607
vserr242cf:30382550
pythontb:30283811
vsjup518:30340749
pythonptprofiler:30281270
vshan820:30294714
vstes263:30335439
vscorecescf:30445987
pythondataviewer:30285071
vscod805:30301674
binariesv615:30325510
bridge0708:30335490
bridge0723:30353136
cmake_vspar411:30581797
vsaa593:30376534
pythonvs932:30410667
cppdebug:30492333
vscaat:30438848
vsclangdc:30486549
c4g48928:30535728
dsvsc012cf:30540253
azure-dev_surveyonecf:30548226
pyindex848cf:30577861
nodejswelcome1cf:30587006
2e4cg342:30602488
f6dab269:30613381

About this issue

  • Original URL
  • State: closed
  • Created a year ago
  • Reactions: 2
  • Comments: 71 (34 by maintainers)

Most upvoted comments

I am still curious if you think I should open a VS Code issue to ask for an extension API regarding environment changes? You are far better of to judge if that would make sense or not than I am.

Honestly I think such an API request will not be implemented due to the fact the NodeJS doesn’t provide it. It would a require poll/compare implementation which is never good.

The previous start failed due to node not being found. Then restarting the client does not fail. It should have if it re-reads the env as the extension host env should contain the proper PATH.

This explains why the restart doesn’t work. The restart fails because the original start fails since it is using the same client object to not loose any internal client state when restarting the server.

What we could do is to use a new client in the restart case if a previous start failed.

I opened https://github.com/microsoft/vscode-eslint/issues/1808

@eldarshamukhamedov there is a setting to control which node version to use eslint.runtime. This can even point to a script where you can do some magic in case you need to.

I would only use a node version different the one the come with VS Code if you need to (e.g. using a eslint plugin that requires some special node features)

Every org I’ve ever worked at ran ESLint via CI, build tools, and/or terminal, in addition to devs using it with VS Code, so it is very important to be able to force the VS Code plugin to use the same version of Node as the rest of the application stack. Who knows what version of Node VS Code is going to choose to ship tomorrow 🤷 The built-in version is meant for use with tools/extensions/internal VS Code features that don’t have local app NPM dependencies, and ESLint will almost always have local dependencies.

That said, there is perhaps a bigger VS Code extension issue here: it’s not always easy to force VS Code to use the specific version of Node that version managers install. The bootstrapping process for a Node instance that an extension uses is obscure and I’ve had to wrestle with it many times (e.g. Volta+Prettier/ESLint, Jest test runner, etc.).

@magnusriga I would only use a node version different the one the come with VS Code if you need to (e.g. using a eslint plugin that requires some special node features)

@dbaeumer I am using 2.4.2 right now, but at the time of writing the above post I am not sure. I will continue monitoring and report back.

image

My comment was to run that command before reproducing the issue, but if it’s intermittent, you can probably ignore that. I’m not sure why it would be intermittent- it doesn’t seem like PATH is going to change.

You can grab the log when you see the issue, but it may or may not help, because if the current session connected to a remote vscode server that had already been started in a previous session then the log won’t show the environment for the earlier session that started the server.

@dbaeumer I just got the issue again. I have set "eslint.trace.server": "messages" both in the User, Remote SSH and Workspace settings. It seems to give no information about which Node version gets used. Probably because the error indicates it does not even find it.

Restarting VS Code does not help.

[Info  - 5:29:08 PM] ESLint server is starting.
[Info  - 5:29:08 PM] ESLint server stopped.
[Error - 5:29:08 PM] ESLint client: couldn't create connection to server.
Launching server using runtime node failed. Error: spawn node ENOENT
[Error - 5:29:08 PM] Starting the server failed.
Launching server using runtime node failed. Error: spawn node ENOENT

If I open the terminal I see:

~/code/projectA (jsdoc)> node -v
v18.14.2

Using the command ESLint: Restart ESLint Server does not help.

[Info  - 5:30:58 PM] ESLint server is starting.
[Info  - 5:30:58 PM] ESLint server stopped.
[Error - 5:30:58 PM] ESLint client: couldn't create connection to server.
Launching server using runtime node failed. Error: spawn node ENOENT
[Error - 5:30:58 PM] Starting the server failed.
Launching server using runtime node failed. Error: spawn node ENOENT
[Error - 5:32:36 PM] Restarting client failed
Error: Client is not running and can't be stopped. It's current state is: startFailed
	at w.shutdown (/home/userA/.vscode-server/extensions/dbaeumer.vscode-eslint-2.4.0/client/out/extension.js:1:103911)
	at w.stop (/home/userA/.vscode-server/extensions/dbaeumer.vscode-eslint-2.4.0/client/out/extension.js:1:103492)
	at w.stop (/home/userA/.vscode-server/extensions/dbaeumer.vscode-eslint-2.4.0/client/out/extension.js:1:265208)
	at w.restart (/home/userA/.vscode-server/extensions/dbaeumer.vscode-eslint-2.4.0/client/out/extension.js:1:265075)
	at /home/userA/.vscode-server/extensions/dbaeumer.vscode-eslint-2.4.0/client/out/extension.js:1:382636
	at m.h (/home/userA/.vscode-server/bin/e344f1f539a80912a0e9357cec841f36ce97a4e2/out/vs/workbench/api/node/extensionHostProcess.js:99:125797)
	at m.$executeContributedCommand (/home/userA/.vscode-server/bin/e344f1f539a80912a0e9357cec841f36ce97a4e2/out/vs/workbench/api/node/extensionHostProcess.js:99:126701)
	at c.N (/home/userA/.vscode-server/bin/e344f1f539a80912a0e9357cec841f36ce97a4e2/out/vs/workbench/api/node/extensionHostProcess.js:109:11655)
	at c.M (/home/userA/.vscode-server/bin/e344f1f539a80912a0e9357cec841f36ce97a4e2/out/vs/workbench/api/node/extensionHostProcess.js:109:11373)
	at c.H (/home/userA/.vscode-server/bin/e344f1f539a80912a0e9357cec841f36ce97a4e2/out/vs/workbench/api/node/extensionHostProcess.js:109:10454)
	at c.G (/home/userA/.vscode-server/bin/e344f1f539a80912a0e9357cec841f36ce97a4e2/out/vs/workbench/api/node/extensionHostProcess.js:109:9432)
	at /home/userA/.vscode-server/bin/e344f1f539a80912a0e9357cec841f36ce97a4e2/out/vs/workbench/api/node/extensionHostProcess.js:109:8220
	at E.invoke (/home/userA/.vscode-server/bin/e344f1f539a80912a0e9357cec841f36ce97a4e2/out/vs/workbench/api/node/extensionHostProcess.js:63:145)
	at h.deliver (/home/userA/.vscode-server/bin/e344f1f539a80912a0e9357cec841f36ce97a4e2/out/vs/workbench/api/node/extensionHostProcess.js:63:2121)
	at n.fire (/home/userA/.vscode-server/bin/e344f1f539a80912a0e9357cec841f36ce97a4e2/out/vs/workbench/api/node/extensionHostProcess.js:63:1729)
	at p.fire (/home/userA/.vscode-server/bin/e344f1f539a80912a0e9357cec841f36ce97a4e2/out/vs/workbench/api/node/extensionHostProcess.js:72:14916)
	at /home/userA/.vscode-server/bin/e344f1f539a80912a0e9357cec841f36ce97a4e2/out/vs/workbench/api/node/extensionHostProcess.js:125:16654
	at E.invoke (/home/userA/.vscode-server/bin/e344f1f539a80912a0e9357cec841f36ce97a4e2/out/vs/workbench/api/node/extensionHostProcess.js:63:145)
	at h.deliver (/home/userA/.vscode-server/bin/e344f1f539a80912a0e9357cec841f36ce97a4e2/out/vs/workbench/api/node/extensionHostProcess.js:63:2121)
	at n.fire (/home/userA/.vscode-server/bin/e344f1f539a80912a0e9357cec841f36ce97a4e2/out/vs/workbench/api/node/extensionHostProcess.js:63:1729)
	at p.fire (/home/userA/.vscode-server/bin/e344f1f539a80912a0e9357cec841f36ce97a4e2/out/vs/workbench/api/node/extensionHostProcess.js:72:14916)
	at s.E (/home/userA/.vscode-server/bin/e344f1f539a80912a0e9357cec841f36ce97a4e2/out/vs/workbench/api/node/extensionHostProcess.js:72:18982)
	at /home/userA/.vscode-server/bin/e344f1f539a80912a0e9357cec841f36ce97a4e2/out/vs/workbench/api/node/extensionHostProcess.js:72:16970
	at E.invoke (/home/userA/.vscode-server/bin/e344f1f539a80912a0e9357cec841f36ce97a4e2/out/vs/workbench/api/node/extensionHostProcess.js:63:145)
	at h.deliver (/home/userA/.vscode-server/bin/e344f1f539a80912a0e9357cec841f36ce97a4e2/out/vs/workbench/api/node/extensionHostProcess.js:63:2121)
	at n.fire (/home/userA/.vscode-server/bin/e344f1f539a80912a0e9357cec841f36ce97a4e2/out/vs/workbench/api/node/extensionHostProcess.js:63:1729)
	at d.acceptChunk (/home/userA/.vscode-server/bin/e344f1f539a80912a0e9357cec841f36ce97a4e2/out/vs/workbench/api/node/extensionHostProcess.js:72:12647)
	at /home/userA/.vscode-server/bin/e344f1f539a80912a0e9357cec841f36ce97a4e2/out/vs/workbench/api/node/extensionHostProcess.js:72:11934
	at E.invoke (/home/userA/.vscode-server/bin/e344f1f539a80912a0e9357cec841f36ce97a4e2/out/vs/workbench/api/node/extensionHostProcess.js:63:145)
	at h.deliver (/home/userA/.vscode-server/bin/e344f1f539a80912a0e9357cec841f36ce97a4e2/out/vs/workbench/api/node/extensionHostProcess.js:63:2121)
	at n.fire (/home/userA/.vscode-server/bin/e344f1f539a80912a0e9357cec841f36ce97a4e2/out/vs/workbench/api/node/extensionHostProcess.js:63:1729)
	at n.u (/home/userA/.vscode-server/bin/e344f1f539a80912a0e9357cec841f36ce97a4e2/out/vs/workbench/api/node/extensionHostProcess.js:72:28899)

Disabling the ESLint plugin, reloading VS Code, and enabling it again (without reloading) does make it work again.

Thanks for investigating further.

I will still keep the issue open

Sure, I just provided my temporary issue as an illustration, because it was fixed by proper nvm setup.

BTW, may be it’s possible to improve error message a bit? “Error: spawn node ENOENT” -> ‘Error: spawn node ENOENT, PATH=xxx, cwd=yyy’, or something like that. Now it’s a black box, and debugging (especially for people not so familiar with OS / shell) is really hard.

The ESLint server is relying on the fact that node is available on the PATH or you provided an absolute path to it. If zsh-nvm does some PATH magic it certainly might be the cause of this issue.

@dbaeumer have the same issue recently. May be it related to https://github.com/lukechilds/zsh-nvm (need to investigate a bit), because “eslint.runtime”: “MY_HOME/.nvm/versions/node/v19.8.1/bin/node” (from ‘which node’ in integrated terminal) works fine.

Stack trace with ‘node’:

[Info  - 01:59:29] ESLint server is starting.
[Info  - 01:59:30] ESLint server stopped.
[Error - 01:59:30] ESLint client: couldn't create connection to server.
Launching server using runtime node failed. Error: spawn node ENOENT
[Error - 01:59:30] Starting the server failed.
Launching server using runtime node failed. Error: spawn node ENOENT
[Error - 01:59:37] Restarting client failed
Error: Client is not running and can't be stopped. It's current state is: startFailed
	at w.shutdown (<my home>/.vscode/extensions/dbaeumer.vscode-eslint-2.4.0/client/out/extension.js:1:103973)
	at w.stop (<my home>/.vscode/extensions/dbaeumer.vscode-eslint-2.4.0/client/out/extension.js:1:103554)
	at w.stop (<my home>/.vscode/extensions/dbaeumer.vscode-eslint-2.4.0/client/out/extension.js:1:265270)
	at w.restart (<my home>/.vscode/extensions/dbaeumer.vscode-eslint-2.4.0/client/out/extension.js:1:265137)
	at <my home>/.vscode/extensions/dbaeumer.vscode-eslint-2.4.0/client/out/extension.js:1:382698
	at c.h (/Applications/Visual Studio Code.app/Contents/Resources/app/out/vs/workbench/api/node/extensionHostProcess.js:96:108784)
	at c.$executeContributedCommand (/Applications/Visual Studio Code.app/Contents/Resources/app/out/vs/workbench/api/node/extensionHostProcess.js:96:109688)
	at a.N (/Applications/Visual Studio Code.app/Contents/Resources/app/out/vs/workbench/api/node/extensionHostProcess.js:106:11223)
	at a.M (/Applications/Visual Studio Code.app/Contents/Resources/app/out/vs/workbench/api/node/extensionHostProcess.js:106:10941)
	at a.H (/Applications/Visual Studio Code.app/Contents/Resources/app/out/vs/workbench/api/node/extensionHostProcess.js:106:10034)
	at a.G (/Applications/Visual Studio Code.app/Contents/Resources/app/out/vs/workbench/api/node/extensionHostProcess.js:106:9015)
	at /Applications/Visual Studio Code.app/Contents/Resources/app/out/vs/workbench/api/node/extensionHostProcess.js:106:7803
	at f.invoke (/Applications/Visual Studio Code.app/Contents/Resources/app/out/vs/workbench/api/node/extensionHostProcess.js:63:145)
	at m.deliver (/Applications/Visual Studio Code.app/Contents/Resources/app/out/vs/workbench/api/node/extensionHostProcess.js:63:2066)
	at d.fire (/Applications/Visual Studio Code.app/Contents/Resources/app/out/vs/workbench/api/node/extensionHostProcess.js:63:1704)
	at p.fire (/Applications/Visual Studio Code.app/Contents/Resources/app/out/vs/workbench/api/node/extensionHostProcess.js:72:14907)
	at /Applications/Visual Studio Code.app/Contents/Resources/app/out/vs/workbench/api/node/extensionHostProcess.js:122:16556
	at f.invoke (/Applications/Visual Studio Code.app/Contents/Resources/app/out/vs/workbench/api/node/extensionHostProcess.js:63:145)
	at m.deliver (/Applications/Visual Studio Code.app/Contents/Resources/app/out/vs/workbench/api/node/extensionHostProcess.js:63:2066)
	at d.fire (/Applications/Visual Studio Code.app/Contents/Resources/app/out/vs/workbench/api/node/extensionHostProcess.js:63:1704)
	at p.fire (/Applications/Visual Studio Code.app/Contents/Resources/app/out/vs/workbench/api/node/extensionHostProcess.js:72:14907)
	at MessagePortMain.<anonymous> (/Applications/Visual Studio Code.app/Contents/Resources/app/out/vs/workbench/api/node/extensionHostProcess.js:122:14682)
	at MessagePortMain.emit (node:events:526:28)
	at MessagePortMain._internalPort.emit (node:electron/js2c/utility_init:5:364)

@thernstig you could enable tracing in the ESLint server using "eslint.trace.server": "messages". When it happens you could provide me with the ESLint output channel which should have some information about which node version got used.

I’m running in macOS, and changing the config via .vscode/settings.json. I use volta to manage my Node.js version if that matters, and again, this has been working for years and somehow it broke in the last <2 weeks now.

@dbaeumer the use case to use our own runtime is of course that all our ESLint tests run with constructs available in the Node.js version we use? Or am I missing something?