#!/usr/sbin/dtrace -Cs /* like top but tracks pid's network transfers */ /* By James Dickens jamesd.wi@gmail.com */ #pragma D option quiet #include int DR; /* Data READ */ int DW; /* Data WROTE */ int DRL; /* Data Read in the last second */ int DWL; /* Data Wrote in the last second */ int new_data; /* set when there is new data to print */ dtrace:::BEGIN { printf("Waiting for data...\n"); } fbt:sockfs:socktpi_write:entry { self->registry=1; self->uiop = (struct uio *) arg1; self->request = self->uiop->uio_resid; /* MAX amount of data to send */ } fbt:sockfs:socktpi_read:entry { self->registry=1; self->uiop = (struct uio *) arg1; self->request = self->uiop->uio_resid; /* MAX amount of data to recieve */ } fbt:sockfs:socktpi_read:return /arg0 != 0 && self->registry/ /* don't grab data if an error was returned. */ { size = self->request - self->uiop->uio_resid; /* update the data read */ DR +=size; DRL += size; @data[uid,pid, "rcv'd" ] = sum(size); @datac[uid,pid,"rcv'd" ] = sum(size); self->request=0; self->registry=0; self->uiop=0; new_data=1 ; } fbt:sockfs:socktpi_write:return /arg0 != 0 && self->registry / /* don't grab data if an error was returned. */ { size = self->request - self->uiop->uio_resid ; /* update amount of data sent */ DW += size; DWL += size; @data[uid, pid, "sent" ]= sum(size); @datac[uid,pid,"sent" ] = sum(size); self->request=0; self->registery=0; self->uiop=0; new_data=1; } tick-1s /new_data / { new_data=0; printf("\nwalltime : %Y\nStats for the active last Second\nUID\tPID\tdiretion\tBytes\n", walltimestamp); printa("%d\t%d\t%8s\t%@d\n",@data); printf("Totals for this second\nData Rcv'd ==%d Data Sent == %d TOTAL %d\n", DRL, DWL, DRL+DWL); printf("TOTALS\nData Rcv'd == %d Data Sent ==%d Total TRANSFERRED == %d\n", DR , DW, DR + DW) ; trunc(@data,0); DRL=0; DWL=0; } dtrace:::END { printf("\nGrand Totals\n"); printf("UID\tPID\tdiretion\tBytes\n"); printa("%d\t%d\t%8s\t%@d\t\n",@datac); printf("TOTALS\n"); printf("Data Rcv'd == %d Data Sent ==%d TOTAL TRANSFERRED == %d", DR , DW, DR + DW) ; }