lsof (LiSt Open Files) Kullanımı ve Örnek Komutlar
Warning: mysqli_query(): (HY000/3): Error writing file '/tmp/MYjnM0R9' (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, unix 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.
İçerik İndexi
- Kurulum
- Kullanım
-
Örnekler
- Tüm port ve bağlantıların listelenmesi
- Belli port ve bağlantıların listelenmesi
- Belirli bir IP'den kurulan bağlantılar
- Kullanıcıların açtığı dosyalar
- Belli bir dosyaya erişen süreçler
- Belli bir dizine erişen kullanıcı ve süreçler
- Belirli bir disk bölümüne erişen süreçler
- Spesifik bir sürecin açtığı dosyalar
- Belirli bir komut çalıştıran süreçler
- Birden fazla kritere göre listeleme
- Sadece süreç numaralarının listelenmesi
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:
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 komut girilmelidir.
# lsof -i :22
Komutun çıktısı aşağıdakine benzer olacaktır.
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.
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/
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
Trackbacks
Yorumda bulunun.
çok güzel anlatılmış teşekkürler.
[Cevapla]