psydvl
(Dmitriy P)
December 15, 2025, 11:27am
1
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
No rg at all on start, why cursor even need it on launch?
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
deanrie
(Dean Rie)
December 15, 2025, 11:45am
2
Hey, thanks for the report.
I see two issues:
Cursor scans HOME directory when launched via .desktop entry
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.
psydvl
(Dmitriy P)
December 15, 2025, 11:56am
3
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
deanrie
(Dean Rie)
December 15, 2025, 12:36pm
4
Thanks for the data and logs, very helpful. I’ll pass this to the team.
system
(system)
Closed
January 6, 2026, 12:36pm
6
This topic was automatically closed 22 days after the last reply. New replies are no longer allowed.