lsof 활용 가이드

by ADMINPLAY posted Nov 30, 2009
?

단축키

Prev이전 문서

Next다음 문서

ESC닫기

크게 작게 위로 아래로 댓글로 가기 인쇄
Tip 1) 어떤 특정한 파일을 사용하고 있는 프로세스들에 대한 정보를 알고 싶을 때,

$ lsof (expected file name with path)

을 실행하면 된다.

$ lsof /etc/passwd

를 실행하면, /etc/passwd를 억세스하고 있는 프로세스들을 점검할 수 있으며, 이 파일을 가지고 장난치는 프로세스들도 발견할 수 있다.

Tip 2) 어떤 파일 시스템 내에, 그렇게 큰 크기의 파일들을 찾을 수 없는데도 불구하고, Available Space가 0을 향해서 치닫고 있을 수도 있다. 아마도, unlink된 파일에 대고 계속해서 써 대고 있을 가능성이 크다. lsof는

$ lsof (expected directory - root of mounted partition)

의 형식으로 해당 디렉토리 내, 혹은 partition 내에 있는 모든 파일들에 대해 억세스하고 있는 프로세스들을 열거해 줄 수 있다. 역시 장난 치는 프로세스를 발견할 수 있을 것이다.

Tip 3) 긴급히 어떤 파일 시스템을 unmount해야 할 때, 여러분은 해당 파일 시스템에 있는 파일들을 사용하는 프로세스들 덕분에 unmount를 하지 못하고 마냥 기다리기만 했던 일을 겪어 봤을 것이다. lsof는 파일 시스템 내에 있는 파일들에 대해서 억세스하고 있는 프로세스들을 다 찾아줄 수 있다.

$ lsof (expected file system name)

이것을 이용해서 즉시 unmount를 하는 스크립트도 간단히 만들 수 있을 것이다.

Tip 4) lsof는 모든 네트워크 Socket들을 찾아낼 수 있다.

$ lsof -i

를 실행하면, 현재 사용되고 있는 모든 Socket들을 볼 수 있을 것이다.

Tip 5) Tip 4)를 잘 이용하면, 어떤 네트워크 Connection에 대해서 그 목적지 나 어디서 부터 맺어진 연결인지를 쉽게 알아낼 수 있다. 만약, 여러분의 서버 에서 돌아가고 있는 프로세스들 중에서, security.kaist.ac.kr로 연결을 하고 있는 프로세스를 잡아낼 수 있으며, 구체적으로 어떤 서비스(혹은 포트)에 연 결하고 있는가도 지정하여 알아낼 수 있다.

$ lsof -i@security.kaist.ac.kr $ lsof -iTCP(|UDP)@security.kaist.ac.kr:smtp

물론 여러개의 -i옵션을 이용해서 다양한 호스트로의 연결을 잡아낼 수 있다.

Tip 6) Tip 5)를 응용해서 netstat과 물려서 이용하는 예도 있다.


$ netstat -t
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 security.kaist.ac:1019 fool.bbaga.co.kr:login ESTABLISHED

자, 누군가가 fool.bbaga.co.kr의 login 서비스로 커넥트하고 있는 것이 발견 됐다. 이 프로세스를 Tip 5)를 이용해서 찾아보도록 하자.

$ lsof -iTCP@fool.bbaga.co.kr:login
COMMAND PID USER FD TYPE DEVICE SIZE/OFF INODE NAME
rlogin 25023 godslord 3u inet 0x10144168 0t184 TCP security.kaist.ac.kr:1019-)fool.bbaga.co.kr:login
...

Tip 7) lsof로, 어떤 특정한 프로그램의 프로세스들이 억세스하고 있는 모든 파일들을 볼 수 있다. -c 옵션으로 이것을 간단하게 해결할 수 있다.
$ lsof -c httpd

httpd 데몬을 통해서 억세스 되고 있는 모든 파일들을 열람할 수 있다.

Tip 8) lsof를 이용하여, rcp나 ftp를 이용한 파일 전송 과정을 모니터링 할 수도 있다. 먼저 대상이 되는 프로세스를 ps 등을 이용해서 찾아낸다. 그런 다음,

$ lsof -p (PID)

를 하면 당연히 해당 프로세스가 열고 있는 파일들을 열람할 수 있게 된다. 조금 더 자세히하고 싶다면, ftp는 일반적으로 9,10이나 10,11번을 각각 Socket과 Local Data File에 할당하고, rcp는 3,4번을 할당한다. 이를 이용 하면,

$ lsof -p (PID) -ad9,10 -r

이런 식으로 되며, 어떤 뜻인지는 위의 옵션 설명을 보고 해석해 보기 바란다.

Tip 9) lsof로는 어떤 유저가 열고 있는 모든 파일들을 열거해 볼 수도 있다.

$ lsof -u(loginname) 혹은 $ lsof -u(UID)

-u 옵션에는 인자를 ","로 구분하여 여러 인자를 한 꺼번에 넘길 수 있다.

$ lsof -ugodslord,sakai,astroby

즉, godslord, sakai, astroby의 유저들이 열고 있는 모든 파일들을 열거한다. -u 옵션을 사용하면서, 특정한 유저에 대한 정보는 보고 싶지 않을 때는, Login Name이나 UID의 앞에 "^"를 붙여 주면 된다.

$ lsof -u ^root 혹은 $ lsof -u ^0

이렇게 되면, root에 대해서는 체크를 하지 않는다.

Tip 10) lsof를 이용해서, 로그인 추적도 가능하다. 다음의 예제는 Solaris 2.x 에서의 경우이다.


$ lsof -i@security.kaist.ac.kr
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
in.rlogin 8112 root 0u inet 0x60d7c7e8 0t2 TCP fool.bbaga.co.kr:login-)security.kaist.ac.kr:1018 (ESTABLISHED)
in.rlogin 8112 root 1u inet 0x60d7c7e8 0t2 TCP fool.bbaga.co.kr:login-)security.kaist.ac.kr:1018 (ESTABLISHED)
in.rlogin 8112 root 2u inet 0x60d7c7e8 0t2 TCP fool.bbaga.co.kr:login-)security.kaist.ac.kr:1018 (ESTABLISHED)

security.kaist.ac.kr에서부터 fool.bbaga.co.kr로 로긴한 프로세스가 있다. 이 프로세스의 ID는 8112번이다.

$ lsof -p 8112
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
....
in.rlogin 8112 root 4u VCHR 23,0 0t0 136785 /devices/pseudo/clone@0:ptmx-)logindmux-)ptm
in.rlogin 8112 root 5u VCHR 4,0 0t0 136939 /devices/pseudo/clone@0:logindmux-)logindmux
in.rlogin 8112 root 6u VCHR 4,1 0t0 136939 /devices/pseudo/clone@0:logindmux-)logindmux
...

물론 다른 내용도 많겠지만 위의 내용, 특히 맨 첫 라인에 주목해 보자. 이 프로세스는 DEVICE 항목에서 보듯이, 23, 0의 Device를 사용하고 있으며, 이는 곧, /dev/pts/0을 의미한다.

$ lsof /dev/pts/0
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
tcsh 8114 godslord 15u VCHR 24,0 0t35381 136786 /dev/pts/../../devices/pseudo/pts@0:0
...

즉, 이 유저는 /dev/ptr/0에서 tcsh 프로세스를 가지고 로긴한 사실을 알 수 있다.
Platform마다 다르지만 비슷한 방법으로 로긴을 추적해 낼 수 있다.