Mac 사용자를 위한 lsof 명령 설명
lsof 명령을 익혀 Mac에서 어떤 프로세스가 파일을 열어 두고 있는지 알아내세요. 개발자와 파워 유저를 위한 가이드입니다.
외장 드라이브가 추출되지 않습니다. macOS는 “하나 이상의 프로그램이 사용 중일 수 있습니다"라는 미칠 듯이 모호한 메시지를 줍니다. 어떤 프로그램이요? 알려 주지 않습니다. 여기서 lsof가 등장합니다.
이름은 “list open files(열린 파일 목록)“의 약자이며, 정확히 그 일을 합니다. macOS 같은 Unix 기반 시스템에서는 네트워크 연결, 기기, 디스크 볼륨을 포함해 거의 모든 것이 파일로 취급됩니다. 드라이브를 추출할 수 없을 때, lsof는 어떤 프로세스가 그것을 인질로 잡고 있는지 정확히 알려 줍니다.
기본 구문
추출 문제에 lsof를 쓰는 가장 간단한 방법은 이렇습니다.
lsof /Volumes/YourDriveName
“YourDriveName"을 드라이브의 실제 이름으로 바꾸세요. 이름에 공백이 있으면 전체 경로를 따옴표로 감싸세요.
lsof "/Volumes/My Backup Drive"
이는 그 볼륨에 열린 파일 핸들을 가진 모든 프로세스의 목록을 반환합니다. 각 줄은 프로세스 이름, ID(PID), 실행 중인 사용자, 그리고 접근 중인 구체적인 파일에 대한 정보를 보여 줍니다.
출력 읽기
전형적인 lsof 출력은 대략 이렇게 보입니다.
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mds_store 1234 root 4r REG 1,12 524288 ... /Volumes/External/.Spotlight-V100/...
Finder 5678 you 3r DIR 1,12 1024 ... /Volumes/External
가장 중요한 열은 COMMAND(프로세스 이름), PID(죽일 때 쓰는 프로세스 ID), 그리고 NAME(접근 중인 실제 파일 경로)입니다.
FD는 파일을 연 모드를 나타냅니다. r은 읽기, w는 쓰기, u는 둘 다입니다. 현재 활동을 표시하거나 볼륨에 대기 중인 쓰기가 없음을 증명하지 않습니다.
무엇이 드라이브를 막는지 알아내기
추출 문제에 한정하면, 보통은 어떤 프로세스 이름이 나타나는지만 알면 됩니다. 흔한 범인으로는 mds와 mds_stores(Spotlight 색인), Finder, QuickLookUIService(썸네일 생성), fsevents(파일 시스템 감시자)가 있습니다.
출력이 많아 좁히고 싶다면 grep을 쓸 수 있습니다.
lsof /Volumes/YourDriveName | grep -v "^COMMAND"
이는 헤더 줄을 제거해 실제 프로세스만 보여 줍니다. 고유한 프로세스 이름만 원한다면:
lsof /Volumes/YourDriveName | awk '{print $1}' | sort -u
유용한 플래그
-c 플래그는 명령 이름으로 필터링합니다. Spotlight가 문제라고 의심된다면:
lsof -a -c mds /Volumes/YourDriveName
이는 이름이 “mds"로 시작하는 프로세스만 보여 줍니다.
+D 플래그는 디렉터리의 모든 열린 파일을 재귀적으로 나열합니다.
lsof +D /Volumes/YourDriveName
이는 기본 구문보다 더 철저하지만, 파일이 많은 큰 드라이브에서는 느릴 수 있습니다.
특정 사용자가 드라이브에 열어 둔 프로세스를 보려면:
lsof -a -u yourusername /Volumes/YourDriveName
sudo 없이 lsof 쓰기
기본적으로 lsof는 자신의 사용자 계정 소유의 프로세스만 보여 줍니다. (Spotlight의 mds 같은) root가 실행하는 시스템 프로세스는 sudo와 함께 lsof를 실행하지 않으면 나타나지 않습니다.
sudo lsof /Volumes/YourDriveName
암호를 입력해야 합니다. 추출 문제를 해결할 때는 시스템 프로세스가 막는 경우가 잦으므로 sudo를 쓰는 것이 거의 항상 필요합니다.
막는 프로세스 죽이기
작업을 저장하고 복사와 백업을 마친 뒤 앱을 정상 종료하고 다시 추출하세요. 강제 종료나 강제 추출은 데이터 손실을 일으킬 수 있으며, Ejecta는 쓰기 작업의 안전성을 보증하지 않습니다.
kill 1234
1234를 실제 PID로 바꾸세요. 안 되면 강제로 할 수 있습니다.
kill -9 1234
Spotlight 프로세스 이름만으로 읽기 전용이라고 판단할 수 없습니다. 드라이브를 해제하려고 mds나 mds_stores를 강제 종료하지 마세요. 기다리고 앱을 닫은 뒤 일반 추출을 시도하세요. Ejecta는 이 프로세스를 식별하지만 시스템 프로세스의 일반 종료는 제공하지 않습니다. 계속 차단되면 모든 작업을 저장하고 Mac을 완전히 종료한 뒤 분리하세요.
자신이 소유한 앱(드라이브 디렉터리에 머무는 셸이 든 터미널 창 같은)이라면, 추출을 시도하기 전에 앱을 정상적으로 닫거나 드라이브에서 벗어나는 것이 더 깔끔합니다.
흔한 상황
현재 디렉터리가 드라이브에 있는 터미널: 외장 드라이브의 폴더로 cd 했다면, 그 셸 프로세스가 드라이브를 열어 둡니다. 다른 곳으로 cd 하거나(cd ~) 그 터미널 창을 닫으세요.
Finder 창: Finder가 드라이브를 보여 주는 창을 열어 두었거나, 사이드바에서 드라이브를 선택만 해 두어도 추출을 막을 수 있습니다. 드라이브 내용을 보여 주는 Finder 창을 모두 닫으세요.
Spotlight 프로세스 이름만으로 읽기 전용이라고 판단할 수 없습니다. 드라이브를 해제하려고 mds나 mds_stores를 강제 종료하지 마세요. 기다리고 앱을 닫은 뒤 일반 추출을 시도하세요. Ejecta는 이 프로세스를 식별하지만 시스템 프로세스의 일반 종료는 제공하지 않습니다. 계속 차단되면 모든 작업을 저장하고 Mac을 완전히 종료한 뒤 분리하세요.
파일을 열어 둔 백그라운드 앱: 일부 앱은 문서를 닫은 뒤에도 최근 파일을 참조한 채로 둡니다. Photoshop이나 동영상 편집기 같은 크리에이티브 앱이 흔한 범인입니다. 앱을 완전히 종료하면 보통 파일이 놓여납니다.
명령줄을 넘어서
터미널이 편하지 않거나 드라이브를 뽑을 때마다 lsof 출력을 헤아리고 싶지 않다면, 그래픽 옵션이 있습니다.
활성 상태 보기는 특정 프로세스의 열린 파일을 보여 줄 수 있지만, 어떤 프로세스를 들여다볼지 이미 알고 있어야 합니다. “무엇이 이 드라이브를 사용 중인가?“에 쉽게 답해 주지는 못합니다.
Ejecta: Ejecta는 기간 제한 없이 무료 드라이브 진단을 제공합니다. 유료 라이선스는 지원 앱의 종료 및 추출, 모두 추출, Time Machine 제어를 제공합니다. 시스템 프로세스는 대기, 인증 또는 Mac 종료가 필요할 수 있습니다. 먼저 저장하고 전송을 완료하세요.
명령줄은 그것을 선호하는 사람에게 강력하지만, 드라이브를 뽑는 것처럼 단순한 일에 필수여서는 안 됩니다.
Ejecta는 기간 제한 없이 무료 드라이브 진단을 제공합니다. 유료 라이선스는 지원 앱의 종료 및 추출, 모두 추출, Time Machine 제어를 제공합니다. 시스템 프로세스는 대기, 인증 또는 Mac 종료가 필요할 수 있습니다. 먼저 저장하고 전송을 완료하세요.
지금 구입 -관련 글
diskutil eject: Mac 터미널에서 드라이브를 추출하는 방법
diskutil로 어떤 Mac 드라이브든 터미널에서 추출하세요. 추출되지 않는 볼륨을 강제로 마운트 해제하고 lsof로 무엇이 붙들고 있는지 찾는 법까지 다룹니다.
Mac에서 '디스크를 제대로 추출하지 못했습니다' 해결하는 방법
'디스크를 제대로 추출하지 못했습니다' 경고는 드라이브가 마운트 해제되기 전에 어떤 프로세스가 붙들었다는 뜻입니다. 그것을 찾아 경고를 완전히 멈추는 방법을 알아봅니다.
macOS Sequoia와 Sonoma에서 외장 드라이브를 안전하게 추출하는 방법
Apple은 최근 macOS 버전에서 드라이브 추출이 작동하는 방식을 바꿨습니다. Sequoia와 Sonoma에서 무엇이 달라졌고 흔한 추출 문제를 어떻게 다루는지 알아봅니다.
APFS와 exFAT: Mac 외장 드라이브에 어떤 포맷을 쓸까
외장 드라이브에 알맞은 파일 시스템을 고르는 것은 성능부터 데이터 안전까지 모든 것에 영향을 줍니다. Mac 사용자를 위한 실용적인 정리를 소개합니다.