Jeremy Jones wrote:

> Hello World!
> 
> I'm looking for a way to check a Processes age (how long it's been
> running). Is there a way to do this without installing extra modules?
> I know ps-ef does it, I was hoping for elegance over the hammer &
> chisel...
> 

one way of doing that is to interface the /proc process table if you don't 
want to install extra modules. here is a simple example of what you can do 
to get the running time of your script:

#!/usr/bin/perl -w
use strict;

#--
#-- ask the process table to give me my own process info
#--
open(PROC,'/proc/self/stat') || die("error but why? $!\n");

while(1){

        #--
        #-- generate some CPU activity
        #--
        my $p; $p = sqrt($$) * $_ for(1..300000);

        #--
        #-- gets the process time so far. more on that later
        #--
        my $time = (split(/\s+/,<PROC>))[13] * 0.01 / 100;

        #--
        #-- process ID and the how long it has been running in user mode
        #--
        print "$$: $time\n";

        #--
        #-- rewind and get ready for the next read
        #--
        seek(PROC,0,0);

        #--
        #-- just to avoid printing too much too fast to the screen
        #--
        sleep(1);
}

close(PROC);

__END__

prints:

2845: 0.0065
2845: 0.013
2845: 0.0194
2845: 0.0259
2845: 0.0323
2845: 0.0387
...
^C

note:

* open /proc/self/stat simply ask the kernel for information about the 
current process that's running. 'self' points to its own process and 'stat' 
gives you information about the running process. there are tons of 
information that 'stat' returns but we will be concentrated on just one.

* this line:

        my $time = (split(/\s+/,<PROC>))[13] * 0.01 / 100;
  
asks the kernel to give you updated information about the current process 
(in this case, it's our own process) that's running. we split the line into 
chunks and the 14th element gives us the number of jiffies that this 
process and its children have been scheduled in user mode. i don't know how 
familiar you are with the kernel (or kernel programming) but a jiffies is 
basically 100 millisconds for most platform (except for Alpha (which sets 
it to 1024, i believe) and Real Time Linux (which sets it to 100,000)). the 
'* 0.01 / 100' simply converts it to seconds. this, of course, is not very 
accurate becauser you can simply change the jiffies on your system and 
recompile your kernel. the split on white space is also bugous but for this 
example, let's assume it's correct. for more, check out 'man proc'

* if you run the above script and 'top -p 2845' side by side at the same 
time, you will notice they both report very similiar result. this is no 
surprise because 'top' (as well as 'ps' and Proc::ProcssTable) is 
implemented using the same '/proc' process table with similar technique.

* the above script is very efficient because it directly goes to the process 
table for the info it needs thus avoid using a shell (such as parsing the 
output of 'ps' or 'top') or walking the whole process table (such as 
Proc::ProcessTable). 

david

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to