[Bio] / FigKernelPackages / FIG.pm Repository:
ViewVC logotype

Diff of /FigKernelPackages/FIG.pm

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.115, Thu Jun 10 14:00:36 2004 UTC revision 1.116, Mon Jun 14 22:04:24 2004 UTC
# Line 2  Line 2 
2    
3  use strict;  use strict;
4    
5    use POSIX;
6    
7  use DBrtns;  use DBrtns;
8  use Sim;  use Sim;
9  use Blast;  use Blast;
# Line 6023  Line 6025 
6025      }      }
6026  }  }
6027    
6028    #
6029    # Background job support.
6030    #
6031    # If one wants to turn a script into a background, invoke
6032    # $fig->run_in_background($coderef). This will cause $coderef to be invoked
6033    # as a background job. This means its output will be written to
6034    # $FIG_Config::data/Global/background_jobs/<pid>, and that
6035    # it shows up and is killable via the seed control panel.
6036    #
6037    
6038    sub run_in_background
6039    {
6040        my($self, $coderef) = @_;
6041    
6042        if (ref($coderef) ne "CODE")
6043        {
6044            warn "FIG::run_in_background() invoked without a code reference\n";
6045            return;
6046        }
6047    
6048        my $job_dir = "$FIG_Config::data/Global/background_jobs";
6049        verify_dir($job_dir);
6050    
6051        my $child = fork;
6052    
6053        if (!defined($child))
6054        {
6055            die "run_in_background: fork failed: $!\n";
6056        }
6057    
6058        if ($child == 0)
6059        {
6060            #
6061            # In the child process.
6062            #
6063    
6064            POSIX::setsid();
6065    
6066            my $my_job_dir = "$job_dir/$$";
6067            verify_dir($my_job_dir);
6068    
6069            open(my $info, ">$my_job_dir/INFO");
6070            my $now = asctime(localtime(time()));
6071            chomp($now);
6072            print $info "Background job $$ created from run_in_background by $> on $now\n";
6073            close($info);
6074    
6075            #
6076            # Redirect stdout/stderr to the OUTPUT file.
6077            #
6078    
6079            close(STDOUT);
6080            close(STDERR);
6081    
6082            open STDOUT, ">$my_job_dir/OUTPUT";
6083            open STDERR, ">&STDOUT";
6084    
6085            select(STDERR);
6086            $| = 1;
6087            select(STDOUT);
6088            $| = 1;
6089    
6090            #
6091            # Make stdin be from nowhere.
6092            #
6093    
6094            open STDIN, "</dev/null";
6095    
6096            #
6097            # Run the code.
6098            #
6099    
6100            open(my $stat, ">$my_job_dir/STATUS");
6101            print $stat "Job started at $now\n";
6102            close($stat);
6103    
6104            eval { &$coderef; };
6105    
6106            open(my $stat, ">$my_job_dir/STATUS");
6107    
6108            if ($@ eq "")
6109            {
6110                print $stat "Finished successfully\n";
6111            }
6112            else
6113            {
6114                print $stat "Code had an error:\n$@\n";
6115            }
6116            close($stat);
6117    
6118            exit;
6119        }
6120    
6121        return $child;
6122    }
6123    
6124    
6125  1;  1;

Legend:
Removed from v.1.115  
changed lines
  Added in v.1.116

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3