Hi all,
after reading the post:
*
How to get process start date and time in SOLARIS?
I wrote my perl script and it worked like a charm.
This script is called every 5 minutes by the monitoring server crontab and is executed on the remote network elements via ssh (the perl script is located on the remote machines).
The scripts compare the actual unix time:
PHP Code:
$ACTUAL_UNIX_TIME=time();
and the the process start date+time:
PHP Code:
$PID_PATH="/proc/8895"; #example
@d=localtime((stat($PID_PATH))[9]);
$LOCAL_TIME=sprintf( "Localtime PID %4d/%02d/%02d %02d:%02d:%02d\n", $d[5]+1900,$d[4]+1,$d[3],$d[2],$d[1],$d[0]);
if the difference:
PHP Code:
$DELTA=$ACTUAL_UNIX_TIME-$PID_TIME;
is less that 300seconds (5min) then in the output the restart flag will be set to 1.
For some time I had no problems at all but lately I get fake values especially during the night: it happens that for one/two or even three times the $DELTA is =0sec or =1sec, but checking the next day I discover that the process didn't restarted and its $PID_TIME goes back many hours the fake restart!!!
To me it seems that the wrong value is returned by stat/localtime function.
Is it possible that under certain conditions the stat function doesn't work?
Here is our code:
PHP Code:
#!/usr/bin/perl
################################################################################
# subroutine: TR_HANDLER
# print trace se il flag $DEB = true
################################################################################
sub TR_HANDLER {
$TRACE = $_[0];
chomp($TRACE);
if ($DEB) {
printf("$TRACE\n");
}
}
################################################################################
# main program
#
################################################################################
use Time::Local;
$argc = @ARGV;
$restart=0;
$proc_status="Service running...";
$PID_SERVICE="";
if ($argc > 3 || $argc < 1){
print "Wrong number of arguments.\n";
exit;
}
$CHECK_DELTA=$ARGV[1];
@PROCS=split(/\,/, $ARGV[0]);
if ($ARGV[2]) {
$DEB=1;
} else {$DEB=0}
foreach $PROC_NAME (@PROCS) {
$ACTUAL_UNIX_TIME=time();
$ACTUAL_TIME_STR=sprintf("ACTUAL UNIX TIME = \t".$ACTUAL_UNIX_TIME."\n");
&TR_HANDLER($ACTUAL_TIME_STR);
&TR_HANDLER("ps -ef | grep $PROC_NAME | grep -v grep | grep -v $0 | awk '{print \$2}'");
$PID_SERVICE=`ps -ef | grep "$PROC_NAME" | grep -v grep | grep -v $0 | awk '{print \$2}'`;
if ($PID_SERVICE == ''){
&TR_HANDLER("$PROC_NAME down");
$proc_status="Service down!";
$restart=1;
$PID_TIME=$ACTUAL_UNIX_TIME;
} else {
&TR_HANDLER("PID_SERVICE=$PID_SERVICE");
$PID_PATH=sprintf("/proc/%d/status",$PID_SERVICE);
&TR_HANDLER("PID_PATH=$PID_PATH");
@d=localtime((stat($PID_PATH))[9]);
$LOCAL_TIME=sprintf( "Localtime PID %4d/%02d/%02d %02d:%02d:%02d\n", $d[5]+1900,$d[4]+1,$d[3],$d[2],$d[1],$d[0]);
&TR_HANDLER($LOCAL_TIME);
$sec=$d[0];
$min=$d[1];
$hours=$d[2];
$day=$d[3];
$month=$d[4];
$year=$d[5]+1900;
$PID_TIME = timelocal($sec,$min,$hours,$day,$month,$year);
$PID_TIME_STR=sprintf(" PID_TIME = \t".$PID_TIME."\n");
&TR_HANDLER($PID_TIME_STR);
$DELTA=$ACTUAL_UNIX_TIME-$PID_TIME;
$DELTA_STR=sprintf(" DELTA = \t".$DELTA." seconds\n");
&TR_HANDLER($DELTA_STR);
if ($DELTA > $CHECK_DELTA) {
&TR_HANDLER("No restart detected for $PROC_NAME service!");
$restart=0;
$proc_status="Service running...";
} else {
&TR_HANDLER("$PROC_NAME service restarted!");
$restart=1;
$proc_status="Service restarted!";
}
}
print "$PROC_NAME;$PID_TIME;$ACTUAL_UNIX_TIME;$proc_status;$restart\n";
}