Cursor 2.2 scanning working directory and keep doing it on close

Where does the bug appear (feature/product)?

Cursor IDE

Describe the Bug

On launch Cursor executes ripgrep in working directory
On Linux .desktop entry starts in HOME, so rg launch on it
That can be very painful (and even stuck on infinite loading when using remote SSH connection for some reason) with mounted network fs or busy folders (broken mount etc)

Steps to Reproduce

Launch cursor, see executed processes

/usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin/rg --files --hidden --no-ignore --no-config --color=never -g **/*.code-workspace -g .cursorignore -g **/.git/config

Open second window, close first, close second on Ctrl+Q. rg process keep executing

Expected Behavior

  1. No rg at all on start, why cursor even need it on launch?
  2. Any spawned process (not only ripgrep) killed on window closed and on close on Ctrl+Q

Operating System

Linux

Current Cursor Version (Menu → About Cursor → Copy)

Version: 2.2.20
VSCode Version: 1.105.1
Commit: b3573281c4775bfc6bba466bf6563d3d498d1070
Date: 2025-12-12T06:29:26.017Z
Electron: 37.7.0
Chromium: 138.0.7204.251
Node.js: 22.20.0
V8: 13.8.258.32-electron.0
OS: Linux x64 6.17.7-1.0.12.sr20251001-default

Does this stop you from using Cursor

No - Cursor works, but with this issue

Hey, thanks for the report.

I see two issues:

  1. Cursor scans HOME directory when launched via .desktop entry
  2. ripgrep processes don’t get killed when closing windows

For further investigation, could you share:

  • Full list of Cursor/rg processes after reproduction (via ps aux | grep cursor and ps aux | grep rg)
  • Does the issue reproduce if you launch Cursor with a specific project folder: cursor /path/to/project
  • Does it reproduce with disabled extensions: cursor --disable-extensions

Temporary solution - launch Cursor directly with project path instead of using .desktop entry from HOME.

I’ll pass this to the dev team for a fix.

Launched from .desktop

$ ps aux | grep cursor
psydvl    283191  2.9  0.7 1461544700 244684 ?   Sl   14:47   0:02 /usr/share/cursor/cursor
psydvl    283197  0.0  0.1 34095392 63388 ?      S    14:47   0:00 /usr/share/cursor/cursor --type=zygote --no-zygote-sandbox
psydvl    283198  0.0  0.1 34095384 63424 ?      S    14:47   0:00 /usr/share/cursor/cursor --type=zygote
psydvl    283200  0.0  0.0 34095408 14828 ?      S    14:47   0:00 /usr/share/cursor/cursor --type=zygote
psydvl    283216  0.0  0.0 33576140 3680 ?       Sl   14:47   0:00 /usr/share/cursor/chrome_crashpad_handler --monitor-self-annotation=ptype=crashpad-handler --no-rate-limit --database=/home/psydvl/.config/Cursor/Crashpad --url=https://f.a.k/e --annotation=_productName=Cursor --annotation=_version=2.2.20 --annotation=lsb-release=openSUSE Tumbleweed-Slowroll --annotation=plat=Linux --annotation=prod=Electron --annotation=ver=37.7.0 --initial-client-fd=44 --shared-client-connection
psydvl    283237 15.6  0.5 34567212 168100 ?     Sl   14:47   0:12 /usr/share/cursor/cursor --type=zygote --no-zygote-sandbox
psydvl    283289 16.2  1.0 1480203168 349252 ?   Sl   14:47   0:12 /usr/share/cursor/cursor --type=zygote
psydvl    283459  0.7  0.2  87416 86108 ?        Ss   14:47   0:00 /usr/bin/bash -O extglob -ilc #!/usr/bin/env bash  # Usage: #   source dump_bash_state.bash #   dump_bash_state OUTPUT_FILE # Or execute directly (captures a subshell's state): #   ./dump_bash_state.bash OUTPUT_FILE  dump_bash_state() {   set -euo pipefail    # Require base64 for safe encoding of emitted sections   if ! command -v base64 >/dev/null 2>&1; then     echo "Error: base64 command is required" >&2     return 1   fi    # Helper to log timing, only if DUMP_BASH_STATE_TIMING is set   if [[ -n "${DUMP_BASH_STATE_TIMING:-}" ]]; then     # Timing setup     if [[ "${BASH_VERSION%%.*}" -ge 5 ]]; then       # Use EPOCHREALTIME if available (bash 5+)       local start_time=${EPOCHREALTIME}       local step_start=${EPOCHREALTIME}       _log_timing() {         local step_name="$1"         local now=${EPOCHREALTIME}         local step_duration=$(command awk "BEGIN {printf "%.3f", $now - $step_start}")         local total_duration=$(command awk "BEGIN {printf "%.3f", $now - $start_time}")         builtin printf "[TIMING] %-20s: %6.3fs (total: %6.3fs) " "$step_name" "$step_duration" "$total_duration" >&2         step_start=$now       }     else       # Fallback for older bash versions       local start_time=$(command date +%s.%N)       local step_start=$(command date +%s.%N)       _log_timing() {         local step_name="$1"         local now=$(command date +%s.%N)         local step_duration=$(command awk "BEGIN {printf "%.3f", $now - $step_start}")         local total_duration=$(command awk "BEGIN {printf "%.3f", $now - $start_time}")         builtin printf "[TIMING] %-20s: %6.3fs (total: %6.3fs) " "$step_name" "$step_duration" "$total_duration" >&2         step_start=$now       }     fi   else     _log_timing() { :; }   fi    # Helper to append a line to output file   _emit() {     builtin printf '%s ' "$1"   }    # Helper to safely encode and emit unsafe values   _emit_encoded() {     local content="$1"     local var_name="$2"     if [[ -n "$content" ]]; then       builtin printf 'cursor_snap_%s=$(command base64 -d <<'''CURSOR_SNAP_EOF_%s''' ' "$var_name" "$var_name"       command base64 <<<"$content" | command tr -d ' '       builtin printf ' CURSOR_SNAP_EOF_%s ' "$var_name"       builtin printf ') '       builtin printf 'eval "$cursor_snap_%s" ' "$var_name"     fi   }    # Start fresh   _log_timing "file_init"    # Working directory   _emit "$PWD"   _log_timing "working_dir"    # Environment variables (export statements)   local env_vars   env_vars=$(builtin export -p 2>/dev/null || true)   _emit_encoded "$env_vars" "ENV_VARS_B64"   _log_timing "environment"    # POSIX shell options (replayable as set +/-o lines; exclude nounset which we enable locally)   local posix_opts   posix_opts=$(builtin shopt -po 2>/dev/null | command grep -v '^set -o nounset$' | command grep -v '^set +o nounset$' || true)   _emit_encoded "$posix_opts" "POSIX_OPTS_B64"   _log_timing "posix_options"    # Bash shopt options (replayable as shopt -s/-u lines)   local bash_opts   bash_opts=$(builtin shopt -p 2>/dev/null || true)   _emit_encoded "$bash_opts" "BASH_OPTS_B64"   _log_timing "bash_options"    # Functions: capture all functions   local all_functions   all_functions=$(builtin declare -f 2>/dev/null || true)   _emit_encoded "$all_functions" "FUNCTIONS_B64"   _log_timing "functions"    # Aliases   local aliases   aliases=$(builtin alias -p 2>/dev/null || true)   _emit_encoded "$aliases" "ALIASES_B64"   _log_timing "aliases"     # Done   _log_timing "finalize" }  builtin printf '__CURSOR_STATE_MARKER__\n'; dump_bash_state
psydvl    283462  0.0  0.0   5224  3060 ?        S    14:47   0:00 /usr/share/cursor/resources/app/resources/helpers/cursor-sandbox --sandbox-policy-cwd /home/psydvl --sandbox-policy {"type":"workspace_readwrite","cwd":"/home/psydvl","additional_readwrite_paths":[],"additional_readonly_paths":[],"network_access":false,"disable_tmp_write":false,"block_git_writes":false} --preflight-only -- /bin/true
psydvl    283466  112  0.0  98280 13316 ?        Sl   14:47   1:26 /usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin/rg --files --hidden --no-ignore --no-config --color=never -g **/*.code-workspace -g .cursorignore -g **/.git/config
psydvl    283867  0.0  0.0   6688  4220 pts/1    S+   14:48   0:00 grep --color=auto cursor

$ ps aux | grep ripgrep
psydvl    283466 83.5  0.0  98288 12624 ?        Sl   14:47   1:38 /usr/share/cursor/resources/app/node_modules/@vscode/ripgrep/bin/rg --files --hidden --no-ignore --no-config --color=never -g **/*.code-workspace -g .cursorignore -g **/.git/config
psydvl    283983  0.0  0.0   6688  4232 pts/1    S+   14:49   0:00 grep --color=auto ripgrep

NB on grep rg it’s too much unrelated stuff

It’s reproduced with specific project folder and specific workspace file

It’s reproduced with cursor --disable-extensions

1 Like

Thanks for the data and logs, very helpful. I’ll pass this to the team.

This topic was automatically closed 22 days after the last reply. New replies are no longer allowed.