Infra

[MAC/Linux OS] port kill - lsof 정리

DuL2 2024. 1. 17. 15:23

증상

맥을 통해 개발하면서 port가 오류로 살아있던 적이 없었는데 처음으로 마주하여 application을 종료해야할 일이 생겼다.

 

구글링해서 간단히 해결

 

lsof 정리

lsof 는 list open files 의약자로 시스템에서 열린 파일 목록을 알려주고 사용하는 프로세스, 디바이스 정보, 파일의 종류 등 상세한 정보를 출력해 준다.

 

리눅스와 유닉스는 추상화된 파일 시스템(VFS - Virtual File System)을 사용하므로 일반 파일, 디렉터리, 네트워크 소켓, 라이브러리, 심볼릭 링크 등도 모두 파일로 처리되며 lsof 에서 상세한 정보를 확인할 수 있다.

유닉스마다 고유의 lsof 와 비슷한 용도의 명령어가 있지만 명령어와 옵션이 제각각이고 출력 정보가 상이하여 OS 가 바뀌면 사용하기가 힘들다.

lsof 는 리눅스, AIX, Solaris, FreeBSD, Mac OS X 등 종류에 상관없이 일관된 옵션과 출력 형식을 갖는 장점이 있다.

 

File

옵션 없이 lsof를 실행하면 다음과 같이 모든 열린 파일 정보를 출력한다.

 

컬럼별 의미는 다음과 같다.

  1. COMMAND : 실행한 명령어
  2. PID : process id
  3. USER : 실행한 사용자
  4. FD: File Descriptor, 파일의 종류. 
    • cwd: current working directory
    • rtd: root directory
    • mem : memory-mapped file
    • txt: program text (code and data);
  5. TYPE: 파일 종류
    • DIR: 디렉터리
    • CHR:  character special file
    • REG: regular file
    • unix: 유닉스 도메인 소켓 (MySQL 등이 사용하는 소켓으로 로컬 프로세스에서만 사용 가능하며 TCP/UDP 보다 속도가 매우 빠름)
  6. DEVICE : 장치 번호
  7. SIZE/OFF: 파일의 크기나 오프셋
  8. NODE: 노드 번호
  9. NAME:  파일명

-u : 특정 사용자의 열린 파일 출력

-u 옵션을 사용하면 사용자를 지정할 수 있다.

$ lsof -u dul2(본인 사용자명)

 

예시 사진 생략. 위와 동일

 

특정 파일을 사용하는 프로세스 보기

 

특정 파일을 사용하고 있는 프로세스의 자세한 정보를 볼 수 있다. 옵션 없이 파일의 경로를 지정하면 된다.

$ lsof /var/log/httpd/access_log


특정 디렉터리내 열린 파일 보기


특정 디렉터리 하위의 열린 파일을 표시하고 싶은 경우가 있다. +D 옵션 뒤에 디렉터리 경로를 명시하면 된다. 아래는 /tmp 디렉터리 밑에 열린 파일을 표시한다.

$ lsof +D /tmp

 

-c : 특정 명령어가 사용하는 포트

apache httpd 같은 경우 fork 하여 여러 개의 프로세스가 뜨게 된다. -c 옵션과 httpd 를 주면 httpd 가 오픈한 파일 정보를 출력한다.

$ lsof -c httpd

 

Port

-i : TCP/UDP 포트 표시

-i 옵션은 모든 네트워크 포트를 표시한다. -i 뒤에 프로토콜을 명시하면 해당 프로토콜 관련 포트만 표시한다.

$ lsof -i

 

$ lsof -i TCP
$ lsof -i UDP

 

-i : IPv4 또는 IPv6 포트만 표시

-i 옵션 뒤에 4(IPv4), 또는 6(IPV6) 를 지정하여 특정 IP 의 버전만 확인할 수 있다.

$ lsof -i 4
$ lsof -i 6

예시 사진 생략

-i : 특정 포트를 사용하는 프로세스 정보 보기

보통 가장 많이 쓰는 명령어이다. -i 옵션뒤에 프로토콜과 포트를 명시해 주면 된다. 다음은 TCP 22번 포트(ssh)를 쓰는 프로세스의 정보를 출력한다.

$ lsof -i :8080

-i : 포트 범위 지정

 포트 8080 번 에서 20000번 까지 출력

$ lsof -i :8080-20000

-i : service name 대신 port 번호 표시

IANA 에 등록한 well known 포트는 /etc/services 에 지정되어 있으므로 서비스를 파악하기 용이하다. 하지만 자체 개발한 서비스가 /etc/services 에 등록된 포트를 사용할 경우에는 서비스 이름보다 포트 번호로 표시하는 게 낫다. -P 옵션을 사용하면 서비스 이름대신 포트 번호로 표시해 준다.

예로 java 로 서비스하고 있는 모든 listen 하는 포트를 표시하려면 아래 명령을 실행한다.

서비스 포트 번호 표시

$ lsof -i TCP -P |grep java|grep LISTEN

 

 

-U : Unix domain socket 표시

-U(대문자) 옵션을 사용하면 유닉스 도메인 소켓만 표시할 수 있다.

$ lsof -U |grep java

 

Filter

-u^ : 특정 사용자 제외

사용자 지정 옵션인 -u 에 ^를 추가하면 특정 사용자는 제외할 수 있다.

다음은 dul2 와 root 사용자가 연 파일은 제외하고 정보를 출력한다.

$ lsof -u^dul2 -u ^root


-p  : 특정 프로세스가 오픈한 파일 표시

 

특정 프로세스가 오픈한 파일만 표시한다. -p(소문자) 옵션뒤에 PID를  주면 된다.

$ lsof -p 123

 

 

-t -u : 특정 사용자가 오픈한 모든 프로세스 중지

-t 옵션은 자세한 정보를 출력하지 않고 pid 정보만 출력한다. 다음 명령은 dul2 사용자로 구동한 프로세스의 id 를 리턴한다.

$ lsof -t -u dul2


이를 응용하여 kill 명령어에 pid 만 전달할 수 있으므로 아래와 같이 사용하면 lesstif 사용자의 모든 프로세스를 중지하게 된다.

특정 사용자 프로세스 모두 중지

$ kill -KILL `lsof -t -u dul2`

 

'Infra' 카테고리의 다른 글

[Tool] nGrinder 찍먹 (1) - nGrinder와 설치 이야기  (0) 2024.02.19
[OS] nohub kill  (1) 2024.02.13
Ubuntu 22.04 - Docker 설치  (0) 2024.02.09
Redis 기초  (1) 2024.02.07
[Redis] Mac OS에서 Redis Docker로 실행시키기  (1) 2024.02.06