Shell Scripting / Bash Tricks
Stop scripts from hanging when subshells go rogue
đź§© The Challenge
You ever kick off a background process in a script only to have the whole thing hang at the end because one orphaned child process is still holding onto a file descriptor? I spent an entire morning once trying to figure out why my cleanup routine wouldn’t run, and it turns out the script was just waiting for a pipe to close that never would.
đź’ˇ The Fix
You need to detach your background tasks properly so they don’t tether themselves to your main shell’s process group. It’s the difference between a clean exit and staring at a blinking cursor for ten minutes.
(command_to_run </dev/null >/dev/null 2>&1 & disown)
⚙️ Why It Works
Redirecting stdin, stdout, and stderr to /dev/null ensures the background process doesn’t wait for your script’s terminal input/output, and disown tells the parent shell to stop tracking that process as a child. It keeps the background task alive even after the parent script finishes execution.
🚀 Pro-Tip: Add a trap to kill your background children if the parent script receives a SIGINT so you don’t leave zombies scattered all over the server.
Linux Tips & Tricks | © ngelinux.com | 7/20/2026
