Saya memiliki masalah yang sama hari ini; sayangnya, di sistem saya, -T
pilihan lsof
tidak menerima f
bendera, dan saya juga tidak ingin membuat knetstat
modul kernel.
Untungnya, saya berada di posisi yang bisa strace
aplikasi saat menyiapkan soket, seperti ini:
strace -e trace=setsockopt -f -o /tmp/log ./program arg1 arg2
Ini melacak ./program arg1 arg2
, menulis jejak ke /tmp/log
. Kami hanya melacak setsockopt()
panggilan sistem, yang digunakan untuk mengatur opsi soket. Opsi -f
membuat strace
lacak juga setiap proses turunan yang dibuat oleh program yang dilacak.
Jika Anda beruntung, /tmp/log
akan berisi baris seperti ini:
18806 setsockopt(60, SOL_SOCKET, SO_KEEPALIVE, [1], 4) = 0
Ini menunjukkan bahwa proses 18806
disebut setsockopt()
pada FD 60
untuk mengatur SO_KEEPALIVE
ke 1
(mengaktifkannya), dan panggilan sistem berhasil dengan mengembalikan kode 0
.
Anda juga dapat melampirkan ke proses yang ada:
strace -e trace=setsockopt -f -o /tmp/log -p PID
Anda dapat melepaskan diri dari proses menggunakan CTRL-C
, dan hilangkan -o
opsi dan argumennya untuk mengirim pelacakan ke stderr
.
Di Linux, Anda dapat menggunakan modul kernel knetstat untuk memeriksa opsi soket, termasuk SO_BROADCAST
.
Anda dapat menggunakan lsof(8)
. Jika PID
adalah ID proses dan FD
adalah nomor deskriptor file dari soket yang Anda minati, Anda dapat melakukan ini:
lsof -a -p PID -d FD -T f
Untuk mendaftar semua soket IPv4 dari suatu proses:
lsof -a -p PID -i 4 -T f
Ini akan mencetak opsi soket dengan SO=
, antara lain informasi. Perhatikan bahwa jika tidak ada opsi yang disetel, Anda akan mendapatkan string kosong, jadi Anda akan melihat sesuatu seperti SO=PQLEN=0
dll. Untuk menguji SO_BROADCAST
, cukup ambil string SO_BROADCAST
setelah SO=
, mis.
if lsof -a -p PID -d FD -T f | grep -q 'SO=[^=]*SO_BROADCAST'; then
# socket has SO_BROADCAST
else
# it doesn't
fi