Go4Expert

Go4Expert (http://www.go4expert.com/)
-   Perl (http://www.go4expert.com/articles/perl-tutorials/)
-   -   Check Whether A Process Is Running Or Not (http://www.go4expert.com/articles/check-process-running-t12689/)

pradeep 4Aug2008 17:33

Check Whether A Process Is Running Or Not
 

Introduction



May times we require to check whether a process is running or not, may be for the purpose of maintaining a lock file for a process or for some other reason. Here today we'll discuss a technique in which we can do this checking provided the process/pid being checked is checked is run the same user as who is checking it or the checking script is running as root.

The Technique



We'll use the kill function in Perl to achieve or goal, we'll send a SIGCHLD signal to the process if the function returns a non-zero value then we know the signals were successfully sent, i.e. the process is running. We send the SIGCHLD signal so as not to harm the process being checked.

Example script:
Code: Perl

#!/usr/bin/perl
 
 # @file: check_process.pl - check whether a proccess is running or not.
 
 use strict;
 use POSIX;
 
 my $pid = shift;
 die "usage: check_process.pl pid\n" unless defined $pid;
 
 print "Process ($pid) is ",(kill(SIGCHLD,$pid)!=0)?'running':'not running';


Uses



We sometimes would need to check that only one instance of a programs runs, like a program that runs from cron.It's be really helpful we can check whether the last launch of the program from the cron is still running. I hope someone will find this really useful.

Code: Perl

my ($lock_file) = $0 =~ m!/([^/]+)$!; ## filename for the lock file, the program name should be unique
 my $lock_file = "/tmp/$lock_file.pid"; ## tmp is usually writeable by anyone
 my $pid = $$; ## pid of the current script
 
 if(-e $lock_file)
 {
     open(FL,"<$lock_file");
     my $file_pid=<FL>;
     if(kill(SIGCHLD,$file_pid)!=0)
     {
         print "Already running ($file_pid)\n";
         exit;
     }
 }
 
 open(FL,">$lock_file");
 print FL "$pid";
 close(FL);


debleena_doll2002 5Aug2008 17:35

Re: Check Whether A Process Is Running Or Not
 
good article...

TrainnafalWag 7Aug2008 19:11

I read some of the posts and I think it is a great site.

shabbir 5Sep2008 23:00

Re: Check Whether A Process Is Running Or Not
 
Nominate for article of the month for August 2008

shabbir 17Sep2008 19:11

Re: Check Whether A Process Is Running Or Not
 
Voting for article of the month for August 2008

shabbir 29Sep2008 13:41

Re: Check Whether A Process Is Running Or Not
 
Winner of Article of the month (August)

Maex 14Nov2011 18:13

Re: Check Whether A Process Is Running Or Not
 
Sorry, but sending SIGCHLD to a process to check if it is running is plain wrong.
There is explicit "0" to test if a process is accepting a signal at all, so the correct form would be
kill(0,$pid)
However note, that either way you will receive a !=0 result if you are not root and the process is not owned by you.

PradeepKr 19Nov2011 22:26

Re: Check Whether A Process Is Running Or Not
 
Any justification to Maex's suggestions?

pradeep 25Nov2011 15:08

Re: Check Whether A Process Is Running Or Not
 
Maex is absolutely right, even I didn't know this at the time of writing this. Also, sending a SIGCHLD to the process will invoke any related signal handler which might be undesirable at times and have had a practical experience.


All times are GMT +5.5. The time now is 19:53.