이것은 우리의 계속되는 시리즈 중 하나인 Linux 명령어이며, 이 글에서는 실제 예제와 함께 lsof 명령어를 검토할 것입니다. lsof는 ‘LiSt Open Files’의 의미로, 어떤 파일이 어떤 Linux 프로세스에 의해 열려 있는지 알아내는 데 사용됩니다.
우리가 다 아는 대로 Linux/Unix는 모든 것을 파일로 간주합니다 (파이프, 소켓, 디렉터리, 장치 등). lsof 명령어를 사용하는 이유 중 하나는 디스크를 마운트 해제할 수 없을 때 파일이 사용 중이라고 나오는 경우입니다. lsof 명령어를 사용하여 쉽게 사용 중인 파일을 식별할 수 있습니다.

목차
1. lsof 명령어로 모든 열린 파일 나열하기
다음 예에서는 열린 파일의 긴 목록을 보여줄 것입니다. 그 중 일부는 더 쉽게 이해할 수 있도록 추출되어 명령, PID, 사용자, FD, 유형 등과 같은 열을 표시합니다.
# lsof COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME init 1 root cwd DIR 253,0 4096 2 / init 1 root rtd DIR 253,0 4096 2 / init 1 root txt REG 253,0 145180 147164 /sbin/init init 1 root mem REG 253,0 1889704 190149 /lib/libc-2.12.so init 1 root 0u CHR 1,3 0t0 3764 /dev/null init 1 root 1u CHR 1,3 0t0 3764 /dev/null init 1 root 2u CHR 1,3 0t0 3764 /dev/null init 1 root 3r FIFO 0,8 0t0 8449 pipe init 1 root 4w FIFO 0,8 0t0 8449 pipe init 1 root 5r DIR 0,10 0 1 inotify init 1 root 6r DIR 0,10 0 1 inotify init 1 root 7u unix 0xc1513880 0t0 8450 socket
섹션과 그 값은 자체 설명적입니다. 그러나 FD & TYPE 열에 대해서는 보다 정확하게 검토할 것입니다.
FD – 파일 설명자를 나타내며 다음과 같은 값을 볼 수 있습니다.
- cwd 현재 작업 디렉토리
- rtd 루트 디렉토리
- txt 프로그램 텍스트 (코드 및 데이터)
- mem 메모리 맵 파일
또한 FD 열에서 1u와 같은 숫자는 실제 파일 설명자이며 u,r,w와 같은 모드가 뒤따릅니다.
- r for read access.
- w for write access.
- u for read and write access.
TYPE – 파일의 유형과 식별.
- DIR – 디렉토리
- REG – 일반 파일
- CHR – 문자 특수 파일.
- FIFO – 선입선출
2. 사용자별 열린 파일 목록
다음 명령어는 사용자 tecmint의 모든 열려있는 파일 목록을 표시합니다.
# lsof -u tecmint COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 1838 tecmint cwd DIR 253,0 4096 2 / sshd 1838 tecmint rtd DIR 253,0 4096 2 / sshd 1838 tecmint txt REG 253,0 532336 188129 /usr/sbin/sshd sshd 1838 tecmint mem REG 253,0 19784 190237 /lib/libdl-2.12.so sshd 1838 tecmint mem REG 253,0 122436 190247 /lib/libselinux.so.1 sshd 1838 tecmint mem REG 253,0 255968 190256 /lib/libgssapi_krb5.so.2.2 sshd 1838 tecmint mem REG 253,0 874580 190255 /lib/libkrb5.so.3.3
3. 특정 포트에서 실행 중인 프로세스 찾기
특정 포트의 모든 실행 중인 Linux 프로세스를 찾으려면 -i 옵션과 함께 다음 명령어를 사용하세요. 아래 예제는 22번 포트의 모든 실행 중인 프로세스를 나열합니다.
# lsof -i TCP:22 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 1471 root 3u IPv4 12683 0t0 TCP *:ssh (LISTEN) sshd 1471 root 4u IPv6 12685 0t0 TCP *:ssh (LISTEN)
4. IPv4 및 IPv6 열려있는 파일 목록
아래 예제는 IPv4와 IPv6 네트워크 파일을 별도의 명령어로 열려있는 것만 보여줍니다.
# lsof -i 4 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME rpcbind 1203 rpc 6u IPv4 11326 0t0 UDP *:sunrpc rpcbind 1203 rpc 7u IPv4 11330 0t0 UDP *:954 rpcbind 1203 rpc 8u IPv4 11331 0t0 TCP *:sunrpc (LISTEN) avahi-dae 1241 avahi 13u IPv4 11579 0t0 UDP *:mdns avahi-dae 1241 avahi 14u IPv4 11580 0t0 UDP *:58600 # lsof -i 6 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME rpcbind 1203 rpc 9u IPv6 11333 0t0 UDP *:sunrpc rpcbind 1203 rpc 10u IPv6 11335 0t0 UDP *:954 rpcbind 1203 rpc 11u IPv6 11336 0t0 TCP *:sunrpc (LISTEN) rpc.statd 1277 rpcuser 10u IPv6 11858 0t0 UDP *:55800 rpc.statd 1277 rpcuser 11u IPv6 11862 0t0 TCP *:56428 (LISTEN) cupsd 1346 root 6u IPv6 12112 0t0 TCP localhost:ipp (LISTEN)
5. TCP 포트 범위 1-1024의 열려있는 파일 프로세스 목록
TCP 포트 범위 1-1024의 모든 실행 중인 프로세스를 열려있는 파일의 목록을 나열합니다.
# lsof -i TCP:1-1024 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME rpcbind 1203 rpc 11u IPv6 11336 0t0 TCP *:sunrpc (LISTEN) cupsd 1346 root 7u IPv4 12113 0t0 TCP localhost:ipp (LISTEN) sshd 1471 root 4u IPv6 12685 0t0 TCP *:ssh (LISTEN) master 1551 root 13u IPv6 12898 0t0 TCP localhost:smtp (LISTEN) sshd 1834 root 3r IPv4 15101 0t0 TCP 192.168.0.2:ssh->192.168.0.1:conclave-cpp (ESTABLISHED) sshd 1838 tecmint 3u IPv4 15101 0t0 TCP 192.168.0.2:ssh->192.168.0.1:conclave-cpp (ESTABLISHED) sshd 1871 root 3r IPv4 15842 0t0 TCP 192.168.0.2:ssh->192.168.0.1:groove (ESTABLISHED) httpd 1918 root 5u IPv6 15991 0t0 TCP *:http (LISTEN) httpd 1918 root 7u IPv6 15995 0t0 TCP *:https (LISTEN)
6. ‘ ^ ‘ 문자로 사용자 제외
root 사용자를 제외한 것을 볼 수 있습니다. 위에서 보여드린 것처럼 ‘^’를 사용하여 특정 사용자를 제외할 수 있습니다.
# lsof -i -u^root COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME rpcbind 1203 rpc 6u IPv4 11326 0t0 UDP *:sunrpc rpcbind 1203 rpc 7u IPv4 11330 0t0 UDP *:954 rpcbind 1203 rpc 8u IPv4 11331 0t0 TCP *:sunrpc (LISTEN) rpcbind 1203 rpc 9u IPv6 11333 0t0 UDP *:sunrpc rpcbind 1203 rpc 10u IPv6 11335 0t0 UDP *:954 rpcbind 1203 rpc 11u IPv6 11336 0t0 TCP *:sunrpc (LISTEN) avahi-dae 1241 avahi 13u IPv4 11579 0t0 UDP *:mdns avahi-dae 1241 avahi 14u IPv4 11580 0t0 UDP *:58600 rpc.statd 1277 rpcuser 5r IPv4 11836 0t0 UDP *:soap-beep rpc.statd 1277 rpcuser 8u IPv4 11850 0t0 UDP *:55146 rpc.statd 1277 rpcuser 9u IPv4 11854 0t0 TCP *:32981 (LISTEN) rpc.statd 1277 rpcuser 10u IPv6 11858 0t0 UDP *:55800 rpc.statd 1277 rpcuser 11u IPv6 11862 0t0 TCP *:56428 (LISTEN)
7. 누가 어떤 파일과 명령어를 조회하고 있는지 알아보세요?
다음 예제는 사용자 tecmint가 ping 명령어와 /etc 디렉토리를 사용하고 있음을 보여줍니다.
# lsof -i -u tecmint COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME bash 1839 tecmint cwd DIR 253,0 12288 15 /etc ping 2525 tecmint cwd DIR 253,0 12288 15 /etc
8. 모든 네트워크 연결 목록
다음 명령어와 옵션 ‘-i’를 사용하면 ‘LISTENING & ESTABLISHED’의 모든 네트워크 연결 목록을 보여줍니다.
# lsof -i COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME rpcbind 1203 rpc 6u IPv4 11326 0t0 UDP *:sunrpc rpcbind 1203 rpc 7u IPv4 11330 0t0 UDP *:954 rpcbind 1203 rpc 11u IPv6 11336 0t0 TCP *:sunrpc (LISTEN) avahi-dae 1241 avahi 13u IPv4 11579 0t0 UDP *:mdns avahi-dae 1241 avahi 14u IPv4 11580 0t0 UDP *:58600 rpc.statd 1277 rpcuser 11u IPv6 11862 0t0 TCP *:56428 (LISTEN) cupsd 1346 root 6u IPv6 12112 0t0 TCP localhost:ipp (LISTEN) cupsd 1346 root 7u IPv4 12113 0t0 TCP localhost:ipp (LISTEN) sshd 1471 root 3u IPv4 12683 0t0 TCP *:ssh (LISTEN) master 1551 root 12u IPv4 12896 0t0 TCP localhost:smtp (LISTEN) master 1551 root 13u IPv6 12898 0t0 TCP localhost:smtp (LISTEN) sshd 1834 root 3r IPv4 15101 0t0 TCP 192.168.0.2:ssh->192.168.0.1:conclave-cpp (ESTABLISHED) httpd 1918 root 5u IPv6 15991 0t0 TCP *:http (LISTEN) httpd 1918 root 7u IPv6 15995 0t0 TCP *:https (LISTEN) clock-app 2362 narad 21u IPv4 22591 0t0 TCP 192.168.0.2:45284->www.gov.com:http (CLOSE_WAIT) chrome 2377 narad 61u IPv4 25862 0t0 TCP 192.168.0.2:33358->maa03s04-in-f3.1e100.net:http (ESTABLISHED) chrome 2377 narad 80u IPv4 25866 0t0 TCP 192.168.0.2:36405->bom03s01-in-f15.1e100.net:http (ESTABLISHED)
9. PID로 검색
다음 예제는 PID가 1 [One]인 프로세스를 보여줍니다.
# lsof -p 1 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME init 1 root cwd DIR 253,0 4096 2 / init 1 root rtd DIR 253,0 4096 2 / init 1 root txt REG 253,0 145180 147164 /sbin/init init 1 root mem REG 253,0 1889704 190149 /lib/libc-2.12.so init 1 root mem REG 253,0 142472 189970 /lib/ld-2.12.so
10. 특정 사용자의 모든 활동 종료
때때로 특정 사용자의 모든 프로세스를 종료해야 할 수도 있습니다. 다음 명령어는 tecmint 사용자의 모든 프로세스를 종료합니다.
# kill -9 `lsof -t -u tecmint`
참고: 여기서는 모든 사용 가능한 옵션의 예를 제공하는 것은 불가능합니다. 이 가이드는 lsof 명령어의 사용 방법을 보여주는 것입니다. 더 많은 정보를 알고 싶으시면 lsof 명령어의 매뉴얼 페이지를 참조하시기 바랍니다. 이 글이 유용하다고 생각되시면 아래의 댓글 상자를 통해 공유해 주세요.
Source:
https://www.tecmint.com/10-lsof-command-examples-in-linux/