[Bio] / FortyEight / JobStage.pm Repository:
ViewVC logotype

Annotation of /FortyEight/JobStage.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.2 - (view) (download) (as text)

1 : olson 1.1 package JobStage;
2 :    
3 :     #
4 :     # Class to wrap up the common code that shows up in all of the job stage processing
5 :     # scripts.
6 :     #
7 :    
8 :    
9 :     use strict;
10 :     use Carp qw(cluck croak carp);
11 :     use Job48;
12 :     use FileHandle;
13 :     use ImportJob;
14 :    
15 :     use base 'Class::Accessor';
16 :     __PACKAGE__->mk_accessors(qw(job job_name job_dir meta status_name hostname error_dir sge_dir));
17 :    
18 :     sub new
19 :     {
20 :     my($class, $job_type, $job_name, $job_dir) = @_;
21 :    
22 :     my $job = $job_type->new($job_dir);
23 :     $job or die "Could not create $job_type on $job_dir: $!\n";
24 :    
25 :     my $host = `hostname`;
26 :     chomp $host;
27 :    
28 :     my $errdir = "$job_dir/errors";
29 :     -d $errdir or mkdir $errdir;
30 :    
31 :     my $sgedir = "$job_dir/sge_output";
32 :     -d $sgedir or mkdir $sgedir;
33 :    
34 :    
35 :     my $self = {
36 :     job => $job,
37 :     job_type => $job_type,
38 :     job_name => $job_name,
39 :     job_dir => $job_dir,
40 :     meta => $job->meta,
41 :     status_name => "status.$job_name",
42 :     hostname => $host,
43 :     error_dir => $errdir,
44 :     sge_dir => $sgedir,
45 :     };
46 :    
47 :     return bless $self, $class;
48 :     }
49 :    
50 :     sub open_error_file
51 :     {
52 :     my($self, $tag, $dir) = @_;
53 :    
54 :     my $fh;
55 :     my $file = $self->error_dir . "/$tag.stderr";
56 :     if ($dir eq '>' or $dir eq 'w')
57 :     {
58 :     $fh = new FileHandle(">$file");
59 :     }
60 :     else
61 :     {
62 :     $fh = new FileHandle("<$file");
63 :     }
64 :     return $fh;
65 :     }
66 :    
67 :     sub set_metadata
68 :     {
69 :     my($self, $key, $value) = @_;
70 :     $self->meta->set_metadata($key, $value);
71 :     }
72 :    
73 :     sub get_metadata
74 :     {
75 :     my($self, $key) = @_;
76 :     return $self->meta->get_metadata($key);
77 :     }
78 :    
79 :     sub set_qualified_metadata
80 :     {
81 :     my($self, $key, $value) = @_;
82 :     $self->meta->set_metadata($self->job_name . '.' . $key, $value);
83 :     }
84 :    
85 :     sub get_qualified_metadata
86 :     {
87 :     my($self, $key) = @_;
88 :     return $self->meta->get_metadata($self->job_name . '.' . $key);
89 :     }
90 :    
91 :     sub log
92 :     {
93 :     my($self, $msg) = @_;
94 :    
95 :     $self->meta->add_log_entry($self->job_name, $msg);
96 :     }
97 :    
98 :     sub set_status
99 :     {
100 :     my($self, $status) = @_;
101 :     $self->meta->set_metadata($self->status_name, $status);
102 :     }
103 :    
104 :     sub set_running
105 :     {
106 :     my($self, $status) = @_;
107 :     $self->meta->set_metadata($self->job_name . ".running", $status);
108 :     }
109 :    
110 :     =head3 run_process($tag, $cmd, @args)
111 :    
112 :     Run the given command and argument list in a subshell. Stdout and stderr are collected
113 :     and written to jobdir/errors/$tag.stderr.
114 :    
115 :     If the command fails, this code invokes $stage->fatal() so does not return.
116 :    
117 :     =cut
118 :    
119 :     sub run_process
120 :     {
121 :     my($self, $tag, $cmd, @args) = @_;
122 :    
123 :     -x $cmd or $self->fatal("run_process: command $cmd is not executable");
124 :    
125 :     $self->log("running $cmd @args");
126 :    
127 :     my $pid = open(P, "-|");
128 :     $self->log("created child $pid");
129 :    
130 :     if ($pid == 0)
131 :     {
132 :     open(STDERR, ">&STDOUT");
133 :     exec($cmd, @args);
134 :     die "Cmd failed: $!\n";
135 :     }
136 :    
137 :     my $errfh = $self->open_error_file($tag, "w");
138 :     $errfh->autoflush(1);
139 :    
140 :     while (<P>)
141 :     {
142 :     print $errfh $_;
143 :     print "$tag: $_";
144 :     }
145 :    
146 :     if (!close(P))
147 :     {
148 :     my $msg = "error closing $tag pipe: \$?=$? \$!=$!";
149 :     print $errfh "$msg\n";
150 :     close($errfh);
151 :     print "$msg\n";
152 :     $self->fatal($msg);
153 :     }
154 :     $self->log("process $cmd finishes successfully");
155 :     }
156 :    
157 : olson 1.2 sub open_file
158 :     {
159 :     my($self, @spec) = @_;
160 :    
161 :     my $fh = FileHandle->new(@spec);
162 :     $fh or $self->fatal("Cannot open @spec: $!");
163 :     return $fh;
164 :     }
165 :    
166 :    
167 : olson 1.1 sub fatal
168 :     {
169 :     my($self, $msg) = @_;
170 :    
171 :     $self->meta->add_log_entry($self->job_name, ['fatal error', $msg]);
172 :     $self->meta->set_metadata($self->status_name, "error");
173 :     $self->set_running("no");
174 :    
175 :     croak "$0: $msg";
176 :     }
177 :    
178 :     sub warning
179 :     {
180 :     my($self, $msg) = @_;
181 :    
182 :     $self->meta->add_log_entry($self->job_name, ['warning', $msg]);
183 :    
184 :     carp "$0: $msg";
185 :     }
186 :    
187 :     1;

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3