리눅스의 가장 큰 장점 중 하나는 부팅 과정부터 소프트웨어 패키지 설치까지 시스템의 모든 요소를 손쉽게 확인하고 관리할 수 있다는 점입니다. 이번 글에서는 리눅스에서 lsof 명령어를 사용해 현재 열려 있는 파일과 해당 파일을 사용 중인 프로세스를 확인하는 방법을 자세히 알아봅니다. 이를 활용하면 시스템이 내부적으로 어떻게 동작하는지 이해할 수 있고, 특정 프로세스에 대해 필요한 조치를 취하는 데도 큰 도움이 됩니다.
lsof 명령어란?
열린 파일과 그 파일을 사용 중인 사용자 또는 프로세스를 확인하려면 lsof(List Open Files) 유틸리티를 사용합니다. 대부분의 리눅스 배포판에는 lsof가 기본적으로 설치되어 있습니다.
만약 시스템에 설치되어 있지 않다면 패키지 관리자를 통해 간단히 설치할 수 있습니다.
Debian/Ubuntu 계열
데비안 및 우분투에서는 다음 명령어를 실행합니다:
sudo apt-get install lsof
Arch/Manjaro 계열
Manjaro를 포함한 Arch 기반 배포판에서는 pacman을 사용합니다:
sudo pacman -S lsof
CentOS/RHEL/Fedora 계열
CentOS와 RHEL 계열 배포판에서는 dnf를 이용해 설치할 수 있습니다:
sudo dnf install lsof
lsof로 프로세스가 사용 중인 파일 목록 조회하기
대부분의 리눅스 명령어와 마찬가지로 lsof는 매우 직관적이고 간단하게 사용할 수 있습니다. 터미널에 다음과 같이 입력해 보세요:
sudo lsof
위 명령어를 실행하면 시스템에서 현재 열려 있는 모든 파일에 대한 정보가 출력됩니다.
COMMAND PID TID TASKCMD USER FD TYPE DEVICE SIZE/OFF NODE NAME init 1 root cwd DIR 8,48 4096 2 / init 1 root rtd DIR 8,48 4096 2 / init 1 root txt REG 0,19 632048 281474976743906 /init init 1 root 0u CHR 1,3 0t0 15362 /dev/null init 1 root 1u CHR 1,3 0t0 15362 /dev/null init 1 root 2u CHR 1,3 0t0 15362 /dev/null init 1 root 3w CHR 1,11 0t0 15367 /dev/kmsg init 1 root 4u sock 0,8 0t0 22689 protocol: AF_VSOCK init 1 root 5r REG 0,4 0 4026532185 mnt init 1 root 6r REG 0,4 0 4026532201 mnt init 1 root 7r DIR 8,48 4096 240 /home/cap init 1 root 8u DIR 8,48 4096 2 / init 1 root 9u sock 0,8 0t0 21853 protocol: AF_VSOCK
참고: sudo 권한이 있다면 반드시 명령어 앞에 sudo를 붙여 실행하세요. 그렇지 않으면 일부 시스템 파일에서 "permission denied"(권한 거부) 오류가 발생할 수 있습니다.
위 출력 결과의 각 컬럼이 의미하는 바는 다음과 같습니다:
| 컬럼 | 설명 |
|---|---|
| COMMAND | 대상 파일을 사용 중인 프로세스의 이름입니다. |
| PID | 파일을 사용 중인 프로세스의 고유 식별자(ID)입니다. |
| TID | 스레드 식별자(Thread ID)를 나타냅니다. |
| TASKCMD | 태스크 명령어의 이름입니다. |
| USER | 프로세스를 실행한 사용자의 이름 또는 UID입니다. |
| FD | 파일 디스크립터와 접근 모드 정보입니다. |
| TYPE | 대상 파일과 연관된 노드 유형입니다. |
| DEVICE | 콤마로 구분된 장치 번호입니다. |
| SIZE/OFF | 파일 크기(바이트 단위) 또는 파일 오프셋 크기입니다. |
| NODE | 로컬 파일의 inode 값입니다. stat 명령어로 파일의 inode 정보를 확인할 수 있습니다. |
| NAME | 파일의 마운트 지점 경로입니다. |
이제 lsof 출력 결과의 의미를 이해했으니, 원하는 정보만 골라서 확인하는 필터링 방법을 살펴보겠습니다.
특정 프로세스로 필터링하기
특정 프로세스가 연 파일만 확인하려면 프로세스 이름 또는 PID 값을 사용하면 됩니다.
예를 들어 firefox 프로세스가 사용 중인 파일을 보려면 다음 명령어를 실행합니다:
sudo lsof -c firefox
이 명령은 firefox 프로세스가 현재 열어 놓은 모든 파일을 화면에 출력합니다.
PID로 필터링하고 싶다면 -p 옵션 뒤에 프로세스 ID를 전달하면 됩니다. 대상 프로세스의 PID는 top 명령어나 ps 명령어로 쉽게 확인할 수 있습니다.
예를 들어 firefox 프로세스의 PID를 찾으려면 다음과 같이 입력합니다:
sudo ps aux | grep firefox
PID를 확인한 후에는 lsof로 해당 프로세스가 연 파일을 조회합니다:
sudo lsof -p 2121
위 명령은 지정한 PID를 가진 프로세스가 연 파일들을 모두 출력합니다.
특정 사용자로 필터링하기
특정 사용자가 연 파일만 보고 싶다면 -u 옵션을 사용합니다. 예를 들어 debian 사용자가 연 파일을 확인하려면 다음 명령어를 실행합니다:
sudo lsof -u debian
특정 파일로 필터링하기
반대로, 특정 파일을 어떤 프로세스와 사용자가 열었는지 궁금한 경우가 있을 수 있습니다. 이때는 파일 이름을 lsof에 직접 전달하면 됩니다:
sudo lsof /bin/sleep
위 명령은 지정한 파일과 관련된 정보만 필터링하여, 해당 파일을 연 사용자, 프로세스 ID 등을 함께 보여줍니다.
마무리
이번 튜토리얼에서는 리눅스에서 lsof 명령어를 사용해 시스템의 열린 파일 정보를 조회하는 다양한 방법을 살펴보았습니다. lsof를 능숙하게 활용하면 시스템의 동작 방식을 더 깊이 이해할 수 있고, 문제를 일으키는 프로세스를 신속하게 파악해 적절한 조치를 취할 수 있습니다. 아울러 터미널에서 디렉터리 내용을 나열하는 여러 명령어도 함께 익혀 두면 일상적인 시스템 관리에 큰 도움이 될 것입니다.