Saya kira pada suatu saat Anda bertanya-tanya apakah ada cara untuk menampilkan file yang dibuka oleh suatu proses atau pengguna. Hal baiknya adalah jawaban untuk pertanyaan itu adalah perintah lsof.
Anda mungkin sudah tahu bahwa perintah ls adalah kependekan dari 'daftar'. lsof adalah singkatan dari 'Daftar File Terbuka'. Dan itulah tepatnya yang dilakukannya, membuat daftar file yang terbuka berdasarkan proses, pengguna, dan ID proses.
Mari saya tunjukkan beberapa penggunaan paling umum dari perintah lsof.
lsof contoh perintah
Jika Anda menggunakan perintah lsof tanpa opsi dan argumen apa pun, itu akan mencantumkan semua file yang dibuka oleh semua proses dalam sistem.
lsof
Outputnya harus seperti ini:
COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root cwd DIR 252,1 4096 2 /
systemd 1 root rtd DIR 252,1 4096 2 /
systemd 1 root txt REG 252,1 1595792 17384 /lib/systemd/systemd
systemd 1 root mem REG 252,1 1700792 2077 /lib/x86_64-linux-gnu/libm-2.27.so
Outputnya sebagian besar cukup jelas tetapi Anda mungkin masih bertanya-tanya tentang kolom FD dan TYPE.
FD berarti deskriptor file. Beberapa nilai umum untuk FD adalah:
- cwd – Direktori Kerja Saat Ini
- txt – File teks
- mem – File yang dipetakan memori
- mmap – Perangkat yang dipetakan dengan memori
- NUMBER – Deskriptor file yang sebenarnya. Ini juga memiliki informasi tentang izin file mana yang dibuka.
TYPE adalah no-brainer. Ini menentukan jenis file. Berikut beberapa contohnya:
- REG – File biasa
- DIR – Direktori
- CHR – File khusus karakter
- FIFO – Masuk Pertama Keluar Pertama
Percaya padaku. Anda tidak ingin menjalankan perintah lsof tanpa argumen apa pun.
Mengapa saya mengatakan ini? Karena itu akan mulai membanjiri layar Anda dengan ribuan hasil.
Jika saya menjalankan perintah lsof di server Ubuntu dan menghitung jumlah baris dengan perintah wc, inilah hasilnya.
lsof | wc -l
11432
Ya! Betul sekali. Ada lebih dari sebelas ribu file yang dibuka oleh berbagai proses dalam sistem.
Jangan khawatir. Perintah lsof sangat membantu dalam debugging karena Anda dapat melihat proses apa yang membuka file apa dan file mana yang dibuka oleh proses mana.
Jika Anda tidak login sebagai root, output dari perintah lsof akan sangat terbatas. Sebaiknya gunakan sudo jika Anda masuk sebagai pengguna non-root.
1. Daftar semua proses yang telah membuka file
Ini sederhana. Anda hanya perlu menentukan jalur ke file.
lsof <path_to_file>
2. Daftar semua file yang dibuka oleh pengguna
Ini berguna dalam lingkungan multi-pengguna. Anda dapat membuat daftar semua file yang dibuka oleh pengguna tertentu dengan cara berikut:
lsof -u <user_name>
Anda juga dapat menentukan lebih dari satu pengguna seperti ini:
lsof -u user1, user2
atau seperti ini:
lsof -u user1 -u user2
3. Daftar semua file yang dibuka dalam direktori
Jika Anda bertanya-tanya file mana yang telah dibuka di direktori tertentu, Anda dapat menggunakan perintah lsof dengan opsi +D.
lsof +D <path_to_directory>
Pencarian bersifat rekursif. Jadi itu akan mencantumkan semua file yang dibuka di direktori yang disebutkan dan semua sub-direktorinya.
4. Daftar semua file yang dibuka dengan suatu proses
Anda perlu mengetahui id proses (pid) dalam kasus ini. Jika Anda mengetahui id proses, Anda dapat menggunakan opsi -p dari perintah lsof untuk menemukan file yang dibuka olehnya.
lsof -p <pid>
Anda juga dapat menentukan beberapa id proses.
lsof -p pid1, pid2, pid3
5. Daftar semua file yang dibuka dengan perintah
Ini sangat membantu dalam debugging. Misalkan Anda ingin melihat file apa yang digunakan oleh daemon http, Anda hanya perlu menentukan nama perintah (httpd dalam contoh kita).
lsof -c <command>
6. Temukan dibuka oleh pengguna dan perintah atau proses
Anda dapat menggabungkan opsi seperti pengguna dan perintah dan proses menggunakan opsi –a. Anggap saja sebagai operator AND. Ini memberi Anda filter tambahan saat mencoba mempersempit pencarian Anda.
lsof -a -u user_name -c command_name
7. Buat daftar koneksi jaringan dan port dengan perintah lsof
Anda juga dapat menggunakan perintah lsof untuk menemukan port yang terbuka atau untuk menemukan proses mana yang menggunakan port.
Anda dapat mengajukan semua jenis port terbuka dengan opsi -i:
lsof -i
Outputnya mungkin terlihat seperti ini:
lsof -i
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 920 root 3u IPv4 20507 0t0 TCP *:ssh (LISTEN)
sshd 920 root 4u IPv6 20535 0t0 TCP *:ssh (LISTEN)
docker-pr 1163 root 4u IPv6 21687 0t0 TCP *:https (LISTEN)
docker-pr 1175 root 4u IPv6 21717 0t0 TCP *:http (LISTEN)
sshd 7528 root 3u IPv4 39506588 0t0 TCP testing:ssh->212.91.91.19:58904 (ESTABLISHED)
systemd-r 10993 systemd-resolve 12u IPv4 20901990 0t0 UDP localhost:domain
systemd-r 10993 systemd-resolve 13u IPv4 20901991 0t0 TCP localhost:domain (LISTEN)
Anda juga dapat menentukan jenis koneksi jaringan. Misalnya, untuk membuat daftar semua port TCP yang terbuka, Anda dapat menggunakan:
lsof -i tcp
Untuk menemukan proses mana yang menggunakan port tertentu, Anda dapat memberikan nomor port:
lsof -i :<port_number>
Tips Bonus:Menggunakan operator negasi dengan lsof
Anda dapat menggunakan operator negasi untuk mengecualikan pengguna atau proses saat menggunakan perintah lsof.
Misalnya, Anda ingin membuat daftar semua file yang dibuka oleh pengguna selain root, gunakan dengan cara ini:
lsof -u ^root
Perintah lsof menjadi lebih berguna saat Anda menggunakannya dengan perintah grep.
Saya harap Anda belajar sesuatu yang baru dengan artikel ini. Jika Anda memiliki pertanyaan atau saran, silakan tinggalkan komentar di bawah.