Ana Sayfa » *nix » lsof (LiSt Open Files) Kullanımı ve Örnek Komutlar

lsof (LiSt Open Files) Kullanımı ve Örnek Komutlar


BerbatKötüİdare EderGüzelHarika (Toplam 4 oy. 5 puan üzerinden ortalama 4,00 || Oy vererek siz de katkıda bulunabilirsiniz.)
Loading...

Warning: mysqli_query(): (HY000/3): Error writing file '/tmp/MY2jwKzg' (Errcode: 28 - No space left on device) in /usr/share/nginx/html/syslogs/wp-includes/class-wpdb.php on line 2349

lsof, süreçler tarafından açılmış olan dosyaları listelemeye yarayan bir araçtır. Bildiğiniz gibi *nix sistemlerde, hemen herşey bir dosya olarak mevcudiyet gösterir. Örneğin herhangi bir sürecin eriştiği ya da açtığı “şey” sıradan bir dosya olabileceği gibi, bir dizin, bir block aygıt dosyası (block device), ya da bir sistem kütüphanesi ve ya bir network dosyası (network socket, domain socket) olabilir. Dolayısı ile lsof ile süreçlerin eriştikleri dosyaları saptamak ilgili süreçlerin arka planda yaptığı işlemlerle ilgili daha net fikirler edinmek anlamına gelmektedir. Bu yüzden de özellikle sorun giderme konularında lsof çok güçlü bir araçtır.

Yazının devamında, lsof ile ilgili kullanım bilgilerini ve çeşitli durumlar için örnek komutları bulabilirsiniz.


 

Kurulum


Aslında lsof bir çok popüler sistemde öntanımlı olarak kurulu geliyor. Ancak bazı istisnai durumlar olabiliyor.

RHEL, CentOS, Fedora

RHEL ve CentOS'larda lsof öntanımlı olarak gelmektedir. Ancak sizin sisteminizde durum bu şekilde değilse yum ile kolayca kurabilirsiniz:

# yum install lsof

Debian, Ubuntu

Aynı durum, Debian ve Ubuntu'lar için de geçerlidir. Ancak sisteminizde kurulu olmaması durumunda apt-get ile kolayca kurulabilir:

$ sudo apt-get install lsof

FreeBSD

FreeBSD sistemlerde ise  lsof öntanımlı olarak yüklü gelmiyor. Bu nedenle paketin ayrıca kurulması gerekiyor.
Kurulum işlemi her zamanki gibi..

ister pkg_add aracı ile aşağıdaki şekilde

# pkg_add -r lsof

ya da port ağacından kurabilirsiniz:

# /usr/ports/sysutils/lsof
# make install clean

Diğer

Yukarıda bahsi geçenlerden farklı bir sistem kullanıyorsanız, lsof'u kaynak kodlarından derlemeniz gerekir.
Ayrıca, HP-UX sistemler için, http://hpux.connect.org.uk/hppd/cgi-bin/search?package=&term=/lsof-
Solaris sistemler için de  http://sunfreeware.com/ adresilerinden lsof paketlerine ulaşabilirsiniz.

Kullanım


lsof'u herhangi bir parametre kullanmadan direk çalıştırırsanız sistemde açık olan tüm dosyaların uzunca bir listesini dökecektir.

Spesifik taramalar için ise lsof'un bir çok kullanışlı parametresi bulunmaktadır. Bunlara hızlıca bir göz atmak için -h parametresi ile yardım çıktısını inceleyebileceğiniz gibi aşağıda sıkça lazım olabilecek örnek komutlardan da yardım alabilirsiniz.

Örnekler


Tüm port ve bağlantıların listelenmesi

Açık olan tüm network socketleri ve aktif bağlantıları listelemek için -i parametresi kullanılmaktadır.

# lsof -i

Örnek bir çıktı şu şekildedir:

Output
COMMAND    PID        USER   FD   TYPE DEVICE SIZE NODE NAME
portmap   1925      daemon    4u  IPv4   4749       UDP *:sunrpc
rpc.statd 1936       statd    8u  IPv4   4801       TCP *:54140 (LISTEN)
sshd      2178        root    4u  IPv4   5310       TCP *:ssh (LISTEN)
sshd      4593        root    3r  IPv4  13084       TCP Lab03-Debian.cagri.local:ssh->192.168.12.12:52429 (ESTABLISHED)
apache2   5171        root    3u  IPv6  15230       TCP *:www (LISTEN)
named     5455        bind   20u  IPv6  16006       TCP *:domain (LISTEN)

Görüldüğü gibi dinlenen (LISTEN) tüm portlar ve aktif bağlantılar listelenmektedir.

Eğer, port ve hostname'lerin isim çözümlemesi yapılmadan numerik olarak listelenmesini isterseniz -Pni parametrelerini kullanmanız gerekir:

# lsof -Pni

Sadece TCP port ve bağlantıları listelemek isterseniz de -iTCP parametresini kullanmanız gerekir.

# lsof -iTCP

Aynı şekilde -iUDP derseniz UDP bağlantılar listelenir.

Belli port ve bağlantıların listelenmesi

Tüm port ve bağlantıların listelenmesinden ziyade, belirli bir port üzerideki aktiviteyi görmek için lsof “-i :portnumarası” şeklinde kullanılabilir.
Örnek olarak ssh'a (tcp 22) ait durumu listelemek için aşağıdaki girilmelidir.

# lsof -i :22

Komutun çıktısı aşağıdakine benzer olacaktır.

Output
COMMAND   PID       USER   FD   TYPE DEVICE SIZE NODE NAME
sshd     8194       root    3u  IPv6  38969       TCP *:ssh (LISTEN)
sshd    19074       root    3u  IPv6  75147       TCP 192.168.12.12:ssh->192.168.12.22:52684 (ESTABLISHED)
sshd    19171       cagri   3u  IPv6  76097       TCP 192.168.12.12:ssh->192.168.12.22:52694 (ESTABLISHED)

Görüldüğü gibi ssh daemon'ının 22. portu dinlediği ve ssh servisine hangi kullanıcıların, hangi süreç numarası ile bağlalı bulunduğu gibi bilgiler listelenmektedir.

Belirli bir port aralığını listelemek istemeniz durumunda da lsof'u şu şekilde kullanabilirsiniz:

# lsof -i :20-110

Böylece listeleme işlemi 20 ile 110. port aralığını kapsanacaktır.

Belirli bir IP'den kurulan bağlantılar

Spesifik bir ip adresinden açılan bağlantıları listelemek için ise aşağıdaki komut kullanılabilir.

# lsof  -i @192.168.12.22

Örnek bir çıktı aşağıdakine benzer olacaktır.

Output
COMMAND  PID       USER   FD   TYPE   DEVICE SIZE NODE NAME
sshd    1112       root    3u  IPv6 22102989      TCP 192.168.12.12:ssh->192.168.12.22:31864 (ESTABLISHED)
sshd    1114 	   cagri   3u  IPv6 2127979       TCP 192.168.12.12:ssh->-192.168.12.22:31864 (ESTABLISHED)

Kullanıcıların açtığı dosyalar

Örnek olarak, sistemde çağrı kullanıcısı tarafından açılan dosyaların bir listesi şu şekilde alınabilir:

# lsof -u cagri

Hem cagri hem de root kullanıcısı tarafından açılan dosyaların listelenmesi için komut şu şekildedir.

# lsof -u cagri,root

root kullanıcısı dışında kalan diğer tüm kullanıcılar tarafından açılmış dosyaların tespiti ise aşağıdaki gibi yapılabilir.

# lsof -u ^root

Belli bir dosyaya erişen süreçler

Örnek olarak /var/log/messages isimli dosyaya kimlerin eriştiğini görmek için lsof şu şekilde kullanılabilir:

# lsof /var/log/messages

Belli bir dizine erişen kullanıcı ve süreçler

Mesela, /var/log/ dizini altındaki dosyalara erişen tüm süreçleri listelemek için +d paramertesi kullanılabilir:

# lsof +d /var/log/

/var/log/ dizininde ve tüm alt dizinlerinde bulunan dosyalara erişen süreç ve kullanıcıların listesi için ise +D parametresi kullanılabilir:

# lsof +D /var/log/

Belirli bir disk bölümüne erişen süreçler

Unmount etmek istediğiniz bir disk bölümünüz var, fakat bir süreç bu disk alanındaki bir dosyayı açmış olduğundan dolayı, unmount işlemi disk alanı meşgul olduğu için başarısız oluyor. Bu durumda misal olarak /dev/sda1 isimli disk bölümündeki dosyaya erişen ilgili süreci/kullanıcıyı tespit etmek için lsof'u aşağıdaki şekilde kullanabilirsiniz.

# lsof /dev/sda1

Spesifik bir sürecin açtığı dosyalar

Diyelim ki apache sunucusuna ait 18828 numaralı sürecin eriştiği tüm dosyaları listelemek istiyorsunuz. Bu durumda aşağıdaki şekilde bir komut kullanabilirsiniz.

# lsof -p 18828

Belirli bir komut çalıştıran süreçler

Mesela, bash kabuğunu çalıştıran tüm süreçlerin bir listesi şu şekilde alınabilmektedir:

# lsof -c bash

Birden fazla kritere göre listeleme

lsof ile birden fazla kritere göre listeleme yapmak için -a parametresi kullanılabilmektedir. “and” / “or” anlamina gelen -a parametresi iki lsof sorgusunun birleştirilmesine olanak sağlamaktadır.

Örnek olarak, 192.168.12.22 ip adresinden gelen ve/ve ya sunucunun 80. portu ile ilgili bağlantıların listesi şu şekilde alınabilir:

# lsof  -i @85.105.168.65 -a -i :80

-a ve / ve ya anlamini içerdiği için 80. portu dinleyen apache süreçleride çıktı da yer alacaktır. Sadece establish olmuş bağlantıları listelemek için, komut çıktısını grep'leyebilirsiniz.

# lsof  -i @85.105.168.65 -a -i :80 |grep ESTABLISHED

-a parametresi için örnekleri çoğaltmak mümkün. Misal olarak cagri kullanıcısının /usr/lib/ dizinindeki hangi kütüphanelere eriştiğini görüntülemek için komut şu şekilde kullanılabilir:

# lsof -u cagri -a +D /usr/lib/

Sadece süreç numaralarının listelenmesi

lsof'un -t parametresi, yapılan sorgularda sonuç olarak sadece ilgili süreç numaralarının döndürülmesini sağlamaktadır. Özellikle bir shell script vasıtasi ile spesifik bir sürecin sonlandırılması gibi işlemler için oldukça idealdir.

Bu şekilde herhangi bir dosya ya da dizine erişen süreçler ya da belirli bir porta erişen bağlantılar sonlandırılabilir.

Örnek olarak, 192.168.12.22 ip'sinden kurulmuş çağrı kullanıcısına ait ssh oturumunu sonlandırmak için şu şekilde bir komut kullanılabilir:

# kill -HUP `lsof -t -c sshd -a -u cagri -a -i @192.168.12.12`

Örnekleri çoğaltmak mümkün.
Daha fazla bilgi için aşağıdaki adreslere göz atabilirsiniz.
http://www.manpagez.com/man/8/lsof/
http://en.wikipedia.org/wiki/Lsof
http://blog.lifeoverip.net/2008/03/16/lsofun-analiz-amacli-kullanimi/

Visited 6.260 times, 2 visit(s) today
Kategoriler: *nix,ipucu |

Bu yazılar da ilginizi çekebilir:


- Linux Sistemlerde Gereksiz Servislerin Tespiti ve Kapatılması
- Arşiv (Tar, tar.gz) dosyalarının içeriğinin listelenmesi
- Debian Tabanlı Sistemlerde Paket Sorgulama İşlemleri
- ESX 4 – Failed to open disk Unsupported and/or invalid disk type
- iftop: Interface ve bağlantı bazlı bandwidth kullanımı

Yorumlar


  1. kamil | (Haziran 8th, 2012 3:09 pm)

    çok güzel anlatılmış teşekkürler.

    [Cevapla]

Trackbacks

Yorumda bulunun.