리눅스 시스템에서는 모든 것이 파일로 취급된다는 개념은 널리 알려져 있습니다. 하지만 이는 하드 드라이브 내의 실제 파일보다 훨씬 광범위한 의미를 내포합니다. 이번 튜토리얼에서는 lsof
명령어를 활용하여 파일처럼 다뤄지는 다양한 장치와 프로세스들을 어떻게 식별하는지 알아보겠습니다.
리눅스에서의 파일 개념
리눅스에서 “모든 것이 파일이다”라는 말은 단순한 비유가 아닌, 시스템 설계의 핵심 원칙을 반영합니다. 파일은 단순히 데이터의 묶음이 아니라, 바이트 스트림을 생성하거나 수용하는 모든 것을 포괄하는 추상적인 개념입니다. 프로그램이 파일을 읽을 때 바이트 스트림을 생성하고, 프린터로 전송할 때도 바이트 스트림을 사용합니다. 반대로 파일에 데이터를 기록할 때는 바이트 스트림을 받아들이게 됩니다.
키보드, 네트워크 연결, 프린터, 심지어 프로세스 간 통신 등 다양한 시스템 구성 요소들도 바이트 스트림을 주고받는다는 점에서 파일과 유사하게 취급될 수 있습니다. 이러한 장치들을 파일과 같은 방식으로 처리함으로써 시스템 설계의 복잡성을 줄이고, 다양한 자원을 관리하기 위한 공통된 도구 및 API 세트를 만들 수 있게 되었습니다.
하드 디스크에 저장된 일반적인 데이터 파일이나 프로그램 파일들은 파일 시스템 내의 일반 파일들입니다. 이러한 파일들은 ls
명령어를 통해 쉽게 확인하고 상세 정보를 얻을 수 있습니다.
그렇다면 파일 시스템의 일반 파일 외에 파일처럼 취급되는 다른 장치나 프로세스는 어떻게 확인할 수 있을까요? 이때 lsof
명령어가 중요한 역할을 합니다. lsof
는 시스템에서 열려 있는 모든 파일을 나열하는데, 이는 곧 파일처럼 취급되는 모든 항목을 보여준다는 의미입니다.
lsof 명령어 사용
lsof
명령어는 루트 권한이 필요한 경우가 많습니다. 이는 lsof
가 시스템의 다양한 프로세스 및 장치 정보를 수집하기 때문입니다. 따라서 sudo
명령어를 함께 사용하는 것이 일반적입니다. 그리고 lsof
명령어의 출력 결과는 매우 길기 때문에 less
명령어를 통해 파이프하여 확인하는 것이 편리합니다.
sudo lsof | less
lsof
명령어 실행 시, GNOME 환경에서는 터미널 창에 경고 메시지가 나타날 수 있습니다.
lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs Output information may be incomplete.
이 경고는 lsof
가 GNOME 가상 파일 시스템(GVFS)에 접근하는 과정에서 발생합니다. GVFS는 FUSE(사용자 공간의 파일 시스템)의 한 형태로, GNOME, API, 커널 사이의 인터페이스 역할을 합니다. 루트를 포함한 어떤 사용자도 파일 시스템을 마운트한 사용자(이 경우 GNOME) 외에는 이 파일 시스템에 접근할 수 없기 때문에 발생하는 경고입니다. 따라서 이 경고는 무시해도 됩니다.
lsof
의 출력 결과는 다양한 열로 구성되어 있습니다. 왼쪽 열은 다음과 같습니다.
가장 오른쪽 열은 다음과 같습니다.
lsof 출력 열 정보
모든 열이 모든 유형의 파일에 대해 항상 채워져 있는 것은 아닙니다. 일부 열은 비어 있을 수 있습니다.
명령 (COMMAND) | 파일을 연 프로세스와 관련된 명령어 이름입니다. |
PID | 파일을 연 프로세스의 프로세스 식별 번호입니다. |
TID | 작업(스레드) 식별 번호입니다. 빈칸은 해당 항목이 작업이 아닌 프로세스임을 의미합니다. |
사용자 (USER) | 프로세스가 속한 사용자의 사용자 ID 또는 이름입니다. 혹은 프로세스 정보를 얻기 위해 /proc 디렉토리에 접근한 사용자의 ID나 로그인 이름입니다. |
FD | 파일 기술자를 나타냅니다. 파일 디스크립터는 아래에서 자세히 설명합니다. |
유형 (TYPE) | 파일과 연결된 노드 유형을 나타냅니다. 노드 유형에 대한 상세 설명은 아래에 제공됩니다. |
장치 (DEVICE) | 특수 문자, 블록 특수 파일, 일반 파일, 디렉토리 혹은 NFS 파일의 장치 번호 정보를 쉼표로 구분하거나 파일을 식별하는 커널 참조 주소를 포함합니다. 또한 리눅스 AX.25 소켓 장치의 기본 주소나 장치 이름을 표시할 수도 있습니다. |
크기/오프셋 (SIZE/OFF) | 파일의 크기 또는 파일 오프셋을 바이트 단위로 표시합니다. |
노드 (NODE) | 로컬 파일의 노드 번호, 서버 호스트에 있는 NFS 파일의 inode 번호, 또는 인터넷 프로토콜 유형을 나타냅니다. 스트림의 경우 ‘STR’을 표시하거나, 리눅스 AX.25 소켓 장치의 IRQ 또는 inode 번호를 표시합니다. |
이름 (NAME) | 파일이 있는 마운트 지점과 파일 시스템의 이름을 표시합니다. |
FD 열 (파일 디스크립터)
FD 열에 나타나는 파일 디스크립터는 다양한 옵션 중 하나일 수 있습니다. 매뉴얼 페이지에 모든 내용이 상세히 설명되어 있습니다.
FD 열 항목은 파일 디스크립터, 모드 문자, 잠금 문자의 세 부분으로 구성될 수 있습니다. 몇 가지 일반적인 파일 디스크립터는 다음과 같습니다.
cwd
: 현재 작업 디렉토리.err
: FD 정보 오류 (NAME 열 참조).ltx
: 공유 라이브러리 텍스트 (코드 및 데이터).m86
: DOS 병합 매핑된 파일.mem
: 메모리 매핑된 파일.mmap
: 메모리 매핑된 장치.pd
: 상위 디렉토리.rtd
: 루트 디렉토리.txt
: 프로그램 텍스트 (코드 및 데이터).- 파일 설명자를 나타내는 숫자
모드 문자는 다음 중 하나입니다.
r
: 읽기 액세스 권한w
: 쓰기 액세스 권한u
: 읽기 및 쓰기 액세스 권한' '
: 모드를 알 수 없고 잠금 문자가 없을 때의 공백 문자-
: 모드를 알 수 없고 잠금 문자가 있을 때
잠금 문자는 다음 중 하나입니다.
r
: 파일 일부에 대한 읽기 잠금R
: 전체 파일에 대한 읽기 잠금w
: 파일 일부에 대한 쓰기 잠금W
: 전체 파일에 대한 쓰기 잠금u
: 모든 길이에 대한 읽기 및 쓰기 잠금U
: 알 수 없는 잠금 유형' '
: 공백 문자, 잠금 없음
유형 (TYPE) 열
70개 이상의 항목이 TYPE 열에 나타날 수 있습니다. 자주 볼 수 있는 몇 가지 항목은 다음과 같습니다.
REG
: 일반 파일 시스템 파일DIR
: 디렉토리FIFO
: 선입선출 (FIFO)CHR
: 문자 특수 파일BLK
: 블록 특수 파일INET
: 인터넷 소켓UNIX
: 유닉스 도메인 소켓
특정 파일을 연 프로세스 확인
특정 파일에 접근한 프로세스를 확인하려면 lsof
명령어에 파일 이름을 매개변수로 전달하면 됩니다. 예를 들어 kern.log
파일을 연 프로세스를 확인하려면 다음 명령을 사용합니다.
sudo lsof /var/log/kern.log
위 명령어 실행 결과, rsyslogd
프로세스가 kern.log
파일을 열었음을 확인할 수 있습니다.
디렉토리에서 열린 모든 파일 확인
특정 디렉토리 내에서 열린 파일 및 해당 파일을 연 프로세스를 확인하려면 lsof
명령어에 디렉토리 경로를 매개변수로 전달하고, +D
옵션을 함께 사용해야 합니다. 예를 들어 /var/log/
디렉토리에서 열린 모든 파일을 확인하려면 다음 명령어를 사용합니다.
sudo lsof +D /var/log/
위 명령 실행 결과, /var/log/
디렉토리 내에서 열린 모든 파일 목록이 출력됩니다.
마찬가지로 /home
디렉토리 내에서 열린 모든 파일을 확인하려면 다음 명령어를 사용합니다.
sudo lsof +D /home
/home
디렉토리에서 열린 파일 목록이 출력됩니다. 일부 열에 대한 추가 설명이 있다면 전체 목록이 더 좁혀집니다.
특정 프로세스에서 연 파일 확인
특정 프로세스에서 열린 파일 목록을 확인하려면 -c
(command) 옵션을 사용합니다. lsof
명령어에 여러 검색어를 한 번에 전달할 수도 있습니다.
sudo lsof -c ssh -c init
위 명령은 ssh
또는 init
프로세스에 의해 열린 모든 파일 목록을 출력합니다.
특정 사용자가 연 파일 확인
특정 사용자가 연 파일 목록만 표시하도록 제한하려면 -u
(user) 옵션을 사용합니다. 다음은 사용자 “mary”가 소유하거나 실행한 프로세스가 연 파일 목록을 보여주는 예입니다.
sudo lsof -u mary
위 명령은 사용자 “mary”가 열었거나, “mary”를 대신하여 실행된 프로세스가 연 파일 목록을 보여줍니다. 여기에는 데스크탑 환경에서 열렸거나, Mary가 로그인한 결과로 열린 파일들이 포함됩니다.
특정 사용자가 연 파일 제외
특정 사용자가 연 파일 목록을 제외하려면 ^
연산자를 사용합니다. 사용자를 제외하면 관심 있는 정보를 더 쉽게 찾을 수 있습니다. -u
옵션을 사용하고, 제외하고자 하는 사용자 이름 앞에 ^
문자를 추가하면 됩니다.
sudo lsof +D /home -u ^mary
위 명령은 /home
디렉토리에서 열린 모든 파일 목록을 출력하되, 사용자 “mary”가 연 파일은 제외됩니다.
프로세스 ID로 연 파일 확인
특정 프로세스 ID(PID)를 가진 프로세스에서 연 파일 목록을 확인하려면 -p
(process) 옵션을 사용하고, 해당 프로세스 ID를 매개변수로 전달합니다.
sudo lsof -p 4610
위 명령은 프로세스 ID가 4610인 프로세스가 연 모든 파일 목록을 출력합니다.
특정 파일을 연 프로세스 ID 확인
특정 파일에 접근한 프로세스의 프로세스 ID만 확인하려면 -t
(terse) 옵션을 사용하고, 명령줄에 파일 이름을 전달하면 됩니다.
sudo lsof -t /usr/share/mime/mime.cache
위 명령은 /usr/share/mime/mime.cache
파일을 연 프로세스의 프로세스 ID만 간단하게 나열합니다.
AND 및 OR 검색 사용
이제 SSH 프로세스와 관련된 Mary 사용자가 연 파일 목록을 확인해 보겠습니다. lsof
명령어에 여러 검색어를 한 번에 전달할 수 있다는 것을 알고 있으므로 쉽게 할 수 있을 것 같습니다.
sudo lsof -u mary -c ssh
lsof
명령어의 출력 결과를 확인해 보면, root 권한으로 실행된 항목도 출력되는 것을 볼 수 있습니다. 이는 우리가 기대했던 결과가 아닙니다.
여러 검색어를 함께 사용하면 lsof
명령어는 첫 번째 검색어 또는 두 번째 검색어와 일치하는 모든 파일을 반환하는 방식으로 작동합니다. 즉, OR 검색을 수행하는 것입니다.
lsof
명령어에서 AND 검색을 수행하도록 하려면 -a
(and) 옵션을 사용해야 합니다. 이 옵션을 사용하면 첫 번째, 두 번째 검색어 등 모든 검색어와 일치하는 파일만 나열됩니다.
이제 -a
옵션을 사용하여 다시 시도해 보겠습니다.
sudo lsof -u mary -c ssh -a
이제 목록에 표시된 모든 파일은 Mary가 열었거나, Mary를 대신하여 열린 파일이며, SSH 명령과 관련된 파일들입니다.
자동 새로 고침 기능
+/-r
(repeat) 옵션을 사용하여 lsof
명령어를 반복 모드로 실행할 수 있습니다. 반복 옵션은 +r
또는 -r
의 두 가지 형태로 사용할 수 있습니다. 또한 화면을 새로 고치기 전 lsof
가 대기할 시간(초)을 추가로 지정해야 합니다.
반복 옵션을 사용하여 lsof
를 실행하면, 일반적인 출력 결과와 함께 화면 하단에 점선이 추가됩니다. 지정된 시간(초) 동안 대기한 후 새로운 결과 집합으로 화면을 갱신합니다.
-r
옵션을 사용하면 Ctrl+C 키를 누를 때까지 계속 반복 실행됩니다. 반면 +r
옵션을 사용하면 더 이상 표시할 결과가 없거나 Ctrl+C 키를 누를 때까지 반복 실행됩니다.
sudo lsof -u mary -c ssh -a -r5
출력 목록 하단에 있는 점선에 주목하세요. 이 점선은 출력이 새로 고쳐질 때마다 새로운 데이터 표시를 구분합니다.
인터넷 연결과 관련된 파일 표시
-i
(internet) 옵션을 사용하면 네트워크 및 인터넷 연결과 관련된 프로세스에서 열린 파일을 볼 수 있습니다.
lsof -i
위 명령은 네트워크 및 인터넷 연결에 의해 열린 모든 파일 목록을 출력합니다.
프로세스 ID별 인터넷 연결 관련 파일 표시
특정 프로세스 ID와 연결된 인터넷 연결에 의해 열린 파일을 확인하려면 -p
옵션과 -a
옵션을 함께 사용합니다.
다음은 ID가 606인 프로세스에 의해 인터넷 또는 네트워크 연결을 통해 열린 파일을 찾는 예입니다.
sudo lsof -i -a -p 606
위 명령은 인터넷 또는 네트워크 연결과 관련된 프로세스 ID 606에 의해 열린 모든 파일 목록을 출력합니다.
인터넷 연결 및 명령과 관련된 파일 표시
-c
(command) 옵션을 사용하여 특정 프로세스에서 열린 파일을 찾을 수 있습니다. 다음은 ssh
프로세스와 관련된 인터넷 또는 네트워크 연결에 의해 열린 파일을 찾는 예입니다.
lsof -i -a -c ssh
위 명령은 ssh
프로세스로 인해 열린 모든 파일 목록을 출력합니다.
<img loading=”lazy” decoding=”async” src=”http://wilku.top/wp-content/uploads/2020/12/1607540048_672_