A lab I sometimes do computer work for asked for a mechanism to account how long each user spends logged in on some *nix (Linux and ancient Solaris) boxes. I don’t know of a “proper” solution, so I did things the UNIX way: I wrote a stupid little awk script that parses the output of last -R to get a minute total. This isn’t a terribly clean or safe script, but it does “just enough” input sanitizing, and seems to work. Some (Linux) boxes I have access to appear to clear/archive/rotate wtmp on boot, so it doesn’t help on those.
Does anyone know of a better way to do this? Is there some utility I’m forgetting? Is this script dangerous in some way I’m not thinking of? Script follows:
#!/bin/sh
last -R |
awk '
{
user=$1;
uselength=$9;
# Check line format
if (NF != 9) {
print "Line " NR " discarded, " NF " entries. (Reboot messages, etc.)"
}
else if( $NF == "in"){
print "Line " NR " discarded, still logged in."
}
else{
logins[user]++;
# These times are (Days+Hours:Minutes)
parsedtime=0;
gsub("[()]","",uselength);
split(uselength, sptime, "[+:]");
parsedtime+=sptime[1]*24*60;
parsedtime+=sptime[2]*60;
parsedtime+=sptime[3];
logintime[user]+=parsedtime;
}
}
END {
for (i in logins) {
print i " Logged in " logins[i] " times, for a total of " logintime[i] " minutes";
}
}'
