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"는 읽기와 쓰기 둘 다를 뜻합니다. “cwd"가 보이면 그 프로세스가 해당 위치를 현재 작업 디렉터리로 두고 있는 것입니다. 드라이브의 폴더로 이동한 터미널 창이 열려 있을 때 이런 일이 생깁니다.
무엇이 드라이브를 막는지 알아내기
추출 문제에 한정하면, 보통은 어떤 프로세스 이름이 나타나는지만 알면 됩니다. 흔한 범인으로는 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 -c mds /Volumes/YourDriveName
이는 이름이 “mds"로 시작하는 프로세스만 보여 줍니다.
+D 플래그는 디렉터리의 모든 열린 파일을 재귀적으로 나열합니다.
lsof +D /Volumes/YourDriveName
이는 기본 구문보다 더 철저하지만, 파일이 많은 큰 드라이브에서는 느릴 수 있습니다.
특정 사용자가 드라이브에 열어 둔 프로세스를 보려면:
lsof -u yourusername /Volumes/YourDriveName
sudo 없이 lsof 쓰기
기본적으로 lsof는 자신의 사용자 계정 소유의 프로세스만 보여 줍니다. (Spotlight의 mds 같은) root가 실행하는 시스템 프로세스는 sudo와 함께 lsof를 실행하지 않으면 나타나지 않습니다.
sudo lsof /Volumes/YourDriveName
암호를 입력해야 합니다. 추출 문제를 해결할 때는 시스템 프로세스가 막는 경우가 잦으므로 sudo를 쓰는 것이 거의 항상 필요합니다.
막는 프로세스 죽이기
lsof 출력에서 프로세스 ID(PID)를 알면 그것을 종료할 수 있습니다.
kill 1234
1234를 실제 PID로 바꾸세요. 안 되면 강제로 할 수 있습니다.
kill -9 1234
이건 조심하세요. mds 같은 시스템 프로세스를 죽이면 일시적인 문제가 생길 수 있습니다. 프로세스는 보통 자동으로 다시 시작되지만, Spotlight가 잠시 이상하게 동작하는 것을 볼 수 있습니다. Finder 같은 앱을 죽이는 것은 대체로 안전합니다. macOS가 Finder를 자동으로 다시 시작합니다.
자신이 소유한 앱(드라이브 디렉터리에 머무는 셸이 든 터미널 창 같은)이라면, 추출을 시도하기 전에 앱을 정상적으로 닫거나 드라이브에서 벗어나는 것이 더 깔끔합니다.
흔한 상황
현재 디렉터리가 드라이브에 있는 터미널: 외장 드라이브의 폴더로 cd 했다면, 그 셸 프로세스가 드라이브를 열어 둡니다. 다른 곳으로 cd 하거나(cd ~) 그 터미널 창을 닫으세요.
Finder 창: Finder가 드라이브를 보여 주는 창을 열어 두었거나, 사이드바에서 드라이브를 선택만 해 두어도 추출을 막을 수 있습니다. 드라이브 내용을 보여 주는 Finder 창을 모두 닫으세요.
Spotlight 색인: mds, mds_stores, mdworker 프로세스는 새 드라이브를 자동으로 색인합니다. 끝날 때까지 기다리거나, sudo mdutil -i off /Volumes/YourDriveName으로 색인을 비활성화하거나, 직접 죽일 수 있습니다.
파일을 열어 둔 백그라운드 앱: 일부 앱은 문서를 닫은 뒤에도 최근 파일을 참조한 채로 둡니다. Photoshop이나 동영상 편집기 같은 크리에이티브 앱이 흔한 범인입니다. 앱을 완전히 종료하면 보통 파일이 놓여납니다.
명령줄을 넘어서
터미널이 편하지 않거나 드라이브를 뽑을 때마다 lsof 출력을 헤아리고 싶지 않다면, 그래픽 옵션이 있습니다.
활성 상태 보기는 특정 프로세스의 열린 파일을 보여 줄 수 있지만, 어떤 프로세스를 들여다볼지 이미 알고 있어야 합니다. “무엇이 이 드라이브를 사용 중인가?“에 쉽게 답해 주지는 못합니다.
Ejecta는 바로 이 문제를 위해 만들어졌습니다. 연결된 드라이브를 보여 주고, 각각을 막는 프로세스를 찾아내며, 클릭 한 번으로 그 프로세스를 종료하게 해 줍니다. 본질적으로 lsof가 요구하는 탐정 작업을 감싼 GUI에, 시스템 프로세스를 안전하게 다루는 지능을 더한 것입니다.
명령줄은 그것을 선호하는 사람에게 강력하지만, 드라이브를 뽑는 것처럼 단순한 일에 필수여서는 안 됩니다.
매번 터미널을 쓰고 싶지 않다면, Ejecta가 어떤 프로세스가 드라이브를 막고 있는지 정확히 보여주고 메뉴 막대에서 클릭 한 번으로 종료할 수 있게 해줍니다.
지금 구입 — $9.99