#!/usr/bin/perl use Date::Manip; #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # Archit Shivaprakash # IRIS Project # Department of Computer Science # University of Houston, Houston TX-77204 # Email: archit@cs.uh.edu # July 2003 # Purpose: Extracts the qacct information that is provided by SGE, HPC at UH # Invocation syntax: Iris_Extractor.cgi Source_File_Name # Destination_File_name # Error Handling: Prints "IRIS Extractor Error!!!" to Destination file # and to IRIS Error Directory # Program assumes that it is only invoked when both Source # and Destination Files are present # Failure to do so will cause program to exit pre-maturely # Note: # Assumes use in conjunction with the IRIS Tool # Necessary Permissions need to be set while running this script # Program is tested extensively on Redhat Linux 9.0 # Source file to script is deleted upon completion # Please contact author for Information and Feedback #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # Command Line Arguments Retrieved $source_file=$ARGV[0]; $destination_file=$ARGV[1]; # Redirecting STDERR to IRIS Error Directory open(stderr ,">> ../Error/Iris_Parser.err"); # Collecting IRIS Script Execution Timestamp # Variable Declaration $IRIS_parse_timestamp='Unknown'; $IRIS_day_of_week='Unknown'; $IRIS_month_of_year='Unknown'; $IRIS_day_of_month=-1; $IRIS_hour_of_day=-1; $IRIS_minute_of_hour=-1; $IRIS_second_of_minute=-1; $IRIS_year=-1; # Timestamp Computation Section $IRIS_parse_timestamp=localtime(time); @IRIS_current_time=split(" ",$IRIS_parse_timestamp); $IRIS_day_of_week=shift(@IRIS_current_time); $IRIS_month_of_year=shift(@IRIS_current_time); $IRIS_day_of_month=shift(@IRIS_current_time); $IRIS_temp_time=shift(@IRIS_current_time); $IRIS_year=shift(@IRIS_current_time); @IRIS_current_time=split(/:/,$IRIS_temp_time); $IRIS_hour_of_day=shift(@IRIS_current_time); $IRIS_minute_of_hour=shift(@IRIS_current_time); $IRIS_second_of_minute=shift(@IRIS_current_time); # Opening and Reading from Source File open(DAT,$source_file) || die("Iris_Extractor Error!!!, $IRIS_parse_timestamp, Source File Read Error!, IRIS_Extractor will Exit!\n"); @IRIS_raw_data=; close(DAT); # Creation of Destination File # The original copy of the file, if existent will be over-written open(DAT, ">$destination_file") || die("Iris_Extractor Error!!!, $IRIS_parse_timestamp, Destination File Creation Error!, IRIS_Extractor will Exit!\n"); close(DAT); # Reopening Destination file in Append Mode for Writing open(DAT, ">>$destination_file") || die("Iris_Extractor Error!!!, $IRIS_parse_timestamp, Destination File Append Error!, IRIS_Extractor will Exit!\n"); # Variables Declaration Section $count=0; $temp1='Unknown'; $temp2='Unknown'; $queue_name='Unknown'; $job_owner='Unknown'; $job_name='Unknown'; $job_id='Unknown'; $execution_time='Unknown'; $job_fail_success_status=0; $job_nodes='Unknown'; $job_cpu_time='Unknown'; $job_memory_usage='Unknown'; $qsub_timestamp='Unknown'; $qsub_day_of_week='Unknown'; $qsub_month_of_year='Unknown'; $qsub_day_of_month=-1; $qsub_hour_of_day=-1; $qsub_minute_of_hour=-1; $qsub_second_of_minute=-1; $qsub_year=-1; $start_timestamp='Unknown'; $start_day_of_week='Unknown'; $start_month_of_year='Unknown'; $start_day_of_month=-1; $start_hour_of_day=-1; $start_minute_of_hour=-1; $start_second_of_minute=-1; $start_year=-1; $queue_wait_weeks=-1; $queue_wait_days=-1; $queue_wait_hours=-1; $queue_wait_minutes=-1; $queue_wait_seconds=-1; # Operation Flags Declaration Section $job_fail_flag=0; # IRIS_Extractor Implementation Section Begins foreach $line_var(@IRIS_raw_data) { chop($line_var); @line_array=split(" ",$line_var); $temp1=shift(@line_array); # Extracts Queue Name if($temp1 eq "qname") { $queue_name=shift(@line_array); $count++; } # Extracts Job Owner if($temp1 eq "owner") { $job_owner=shift(@line_array); $count++; } # Extracts Job Name if($temp1 eq "jobname") { $job_name=shift(@line_array); $count++; } # Extracts Job ID if($temp1 eq "jobnumber") { $job_id=shift(@line_array); $count++; } # Extracts Execution Time in seconds if($temp1 eq "ru_wallclock") { $execution_time=shift(@line_array); $count++; } # Extracts Job Failure and Success information if($temp1 eq "failed") { $job_fail_success_status=shift(@line_array); if($job_fail_success_status!=0) { $job_fail_flag=1; } } # Extracts Number of Nodes Used if($temp1 eq "slots") { $job_nodes=shift(@line_array); $count++; } # Extracts Accumulated CPU Time if($temp1 eq "cpu") { $job_cpu_time=shift(@line_array); $count++; } # Extracts Accumulated Memory Usage if($temp1 eq "mem") { $job_memory_usage=shift(@line_array); $count++; } # Extracts Qsub Time if($temp1 eq "qsub_time") { $count++; @qsub_time_array=@line_array; $qsub_day_of_week=shift(@line_array); $qsub_month_of_year=shift(@line_array); $qsub_day_of_month=shift(@line_array); $qsub_timestamp=shift(@line_array); $qsub_year=shift(@line_array); @qsub_time=split(/:/,$qsub_timestamp); $qsub_hour_of_day=shift(@qsub_time); $qsub_minute_of_hour=shift(@qsub_time); $qsub_second_of_minute=shift(@qsub_time); } # Extracts Job Start Time if($temp1 eq "start_time") { $count++; @start_time_array=@line_array; $start_day_of_week=shift(@line_array); $start_month_of_year=shift(@line_array); $start_day_of_month=shift(@line_array); $start_timestamp=shift(@line_array); $start_year=shift(@line_array); @start_time=split(/:/,$start_timestamp); $start_hour_of_day=shift(@start_time); $start_minute_of_hour=shift(@start_time); $start_second_of_minute=shift(@start_time); } if($count>=10) { last; } } # Foreach Loop Ends # Job Wait Time Computation $date_time1=ParseDate(\@qsub_time_array); $date_time2=ParseDate(\@start_time_array); $delta_time=DateCalc($date_time1,$date_time2,\$err,1); @queue_wait_time=split(/:/,$delta_time); shift(@queue_wait_time); shift(@queue_wait_time); $queue_wait_weeks=shift(@queue_wait_time); $queue_wait_days=shift(@queue_wait_time); $queue_wait_hours=shift(@queue_wait_time); $queue_wait_minutes=shift(@queue_wait_time); $queue_wait_seconds=shift(@queue_wait_time); $queue_wait_hours=$queue_wait_hours+($queue_wait_days*24)+($queue_wait_weeks*7*24); # Printing Parsed Content to Destination File if($job_fail_flag==1) { print DAT "IRIS_Extractor_Error\n"; unlink $source_file; } if($job_fail_flag==0) { print DAT "Queue_Name=$queue_name\n"; print DAT "Job_Owner=$job_owner\n"; print DAT "Job_Name=$job_name\n"; print DAT "Job_ID=$job_id\n"; print DAT "Execution_Time=$execution_time\n"; print DAT "Job_Submission_Day_Of_Week=$qsub_day_of_week\n"; print DAT "Job_Submission_Month_Of_Year=$qsub_month_of_year\n"; print DAT "Job_Submission_Day_Of_Month=$qsub_day_of_month\n"; print DAT "Job_Submission_Year=$qsub_year\n"; print DAT "Job_Submission_Hour_Of_Day=$qsub_hour_of_day\n"; print DAT "Job_Submission_Minute_Of_Hour=$qsub_minute_of_hour\n"; print DAT "Job_Submission_Second_Of_Minute=$qsub_second_of_minute\n"; print DAT "Queue_Wait_Hours=$queue_wait_hours\n"; print DAT "Queue_Wait_Minutes=$queue_wait_minutes\n"; print DAT "Queue_Wait_Seconds=$queue_wait_seconds\n"; print DAT "Job_Nodes=$job_nodes\n"; print DAT "Job_CPU_Time=$job_cpu_time\n"; print DAT "Job_Memory_Usage=$job_memory_usage\n"; print DAT "Current_Day_Of_Week=$IRIS_day_of_week\n"; print DAT "Current_Month_Of_Year=$IRIS_month_of_year\n"; print DAT "Current_Day_Of_Month=$IRIS_day_of_month\n"; print DAT "Current_Year=$IRIS_year\n"; print DAT "Current_Hour_Of_Day=$IRIS_hour_of_day\n"; print DAT "Current_Minute_Of_Hour=$IRIS_minute_of_hour\n"; print DAT "Current_Second_Of_Minute=$IRIS_second_of_minute\n"; unlink $source_file; }