#!/usr/local/bin/perl5 -w use strict; use Term::ReadKey; $| = 1; $0 = "whoson"; my $userdir = $ENV{HOME}; my $clearstring = `/usr/bin/clear`; my $dotusersfile = "$userdir/.users"; my $changed = 0; my $busy = 1; my $wait = 1; my %dotusers; sub read_userfile { open(U, "<$dotusersfile") || die "Can't open $dotusersfile! ($!)\n"; my @monitor = ; close(U); %dotusers = (); foreach (@monitor) { chomp; $dotusers{$_}{NAME} = $_; $dotusers{$_}{LAST} = 0; } } sub catch_alarm { $wait = 0; } $SIG{ALRM} = \&catch_alarm; $SIG{HUP} = \&read_userfile; read_userfile; ReadMode('cbreak'); do { $changed = 0; open(W, "/usr/bin/w -hi |") || die "Couldn't do `w`! ($!)\n"; my @w = ; close(W); my %users = (); foreach (@w) { chomp; if ($_ =~ / \- hi /x) { print "$_\n"; # this is our own process. since it will always have zero idletime, # we'll skip it... next; } my $user = substr($_, 0, 8); $user =~ s/\s+$//; my $idle = substr($_, 50, 6); $idle =~ s/^\s+//; if (defined($users{$user})) { # `w` was sorted by idle time. later occurrences have larger # idle times. so we don't need these. } else { $users{$user} = $idle; } } print $clearstring; foreach (sort keys %dotusers) { if (defined ($users{$_})) { if ($dotusers{$_}{LAST} == 0) { $dotusers{$_}{LAST} = 1; $changed = 1; printf "\e[1m%-10s %7s\e[0m\n", $_, $users{$_}; } else { printf "%-10s %7s\n", $_, $users{$_}; } } else { $dotusers{$_}{LAST} = 0; } } if ($changed == 1) { print "\07"; } $wait = 1; alarm 3; while ($wait == 1) { select undef,undef,undef,0.1; if (defined (my $key = ReadKey(-1)) ) { if ($key =~ m/q/i) { $wait = 0; $busy = 0; } } else { ; } } } while ($busy == 1); ReadMode('normal'); exit(0);