Finder says your external drive is still in use, but it does not tell you which process is responsible. A terminal, development server or file watcher may still be holding it open after you close the window you were working in.
We built SafeEject to make that easier to investigate. It is a free, open-source macOS utility with a local browser dashboard and a command-line interface.
Demo mode with sample disks and processes.
See the process and the reason
SafeEject uses lsof to identify processes holding a volume, then explains what it finds in plain language. A shell may have its working directory on the disk, a watcher may be reading a folder, or an application may have an open database.
It also shows process ancestry where available, helping you connect a background process to the terminal or agent that started it.
Choose an appropriate next step
The suggested action depends on the reason. For a shell working directory, changing to another folder may be enough. For an open database, closing the application normally gives it a chance to finish writing.
The dashboard supports quitting processes and ejecting a drive. Force quitting is offered separately for processes that refuse to close. macOS services such as Spotlight are left alone by the bulk quit action.
Run it locally
SafeEject runs on macOS with Python 3.9 or later and uses only the Python standard library. The dashboard listens on 127.0.0.1; the application makes no outgoing connections.
You can install it through Homebrew or run it from source. A demo mode lets you explore the interface using sample disks and processes.
Scope and feedback
Process visibility depends on your permissions, so system processes or processes owned by other users may not appear. Failed or partial scans are reported as failures.
Source code and installation instructions
We’d welcome feedback from developers who work from external drives, especially on whether the process explanations make troubleshooting easier.



