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

Annotation of /FortyEight/JobStage.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.3 - (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 : olson 1.3 close($errfh);
155 :     $self->log("process $cmd finishes successfully");
156 :     }
157 :    
158 :     =head3 run_process_nofatal($tag, $cmd, @args)
159 :    
160 :     Run the given command and argument list in a subshell. Stdout and stderr are collected
161 :     and written to jobdir/errors/$tag.stderr.
162 :    
163 :     If the command fails, this code invokes die.
164 :    
165 :     =cut
166 :    
167 :     sub run_process_nofatal
168 :     {
169 :     my($self, $tag, $cmd, @args) = @_;
170 :    
171 :     -x $cmd or die("run_process: command $cmd is not executable");
172 :    
173 :     $self->log("running $cmd @args");
174 :    
175 :     my $pid = open(P, "-|");
176 :     $self->log("created child $pid");
177 :    
178 :     if ($pid == 0)
179 :     {
180 :     open(STDERR, ">&STDOUT");
181 :     exec($cmd, @args);
182 :     die "Cmd failed: $!\n";
183 :     }
184 :    
185 :     my $errfh = $self->open_error_file($tag, "w");
186 :     $errfh->autoflush(1);
187 :    
188 :     while (<P>)
189 :     {
190 :     print $errfh $_;
191 :     print "$tag: $_";
192 :     }
193 :    
194 :     if (!close(P))
195 :     {
196 :     my $msg = "error closing $tag pipe: \$?=$? \$!=$!";
197 :     print $errfh "$msg\n";
198 :     close($errfh);
199 :     print "$msg\n";
200 :     die($msg);
201 :     }
202 :     close($errfh);
203 :     $self->log("process $cmd finishes successfully");
204 :     }
205 :    
206 :     sub run_process_in_shell
207 :     {
208 :     my($self, $tag, $cmd) = @_;
209 :    
210 :     $self->log("running $cmd");
211 :    
212 :     my $pid = open(P, "$cmd |");
213 :     if (!defined($pid))
214 :     {
215 :     $self->fatal("run_process_in_shell(): error creating pipe from $cmd: $!");
216 :     }
217 :    
218 :     $self->log("created child $pid");
219 :    
220 :     my $errfh = $self->open_error_file($tag, "w");
221 :     $errfh->autoflush(1);
222 :    
223 :     while (<P>)
224 :     {
225 :     print $errfh $_;
226 :     print "$tag: $_";
227 :     }
228 :    
229 :     if (!close(P))
230 :     {
231 :     my $msg = "error closing $tag pipe: \$?=$? \$!=$!";
232 :     print $errfh "$msg\n";
233 :     close($errfh);
234 :     print "$msg\n";
235 :     $self->fatal($msg);
236 :     }
237 :     close($errfh);
238 : olson 1.1 $self->log("process $cmd finishes successfully");
239 :     }
240 :    
241 : olson 1.2 sub open_file
242 :     {
243 :     my($self, @spec) = @_;
244 :    
245 :     my $fh = FileHandle->new(@spec);
246 :     $fh or $self->fatal("Cannot open @spec: $!");
247 :     return $fh;
248 :     }
249 :    
250 :    
251 : olson 1.1 sub fatal
252 :     {
253 :     my($self, $msg) = @_;
254 :    
255 :     $self->meta->add_log_entry($self->job_name, ['fatal error', $msg]);
256 :     $self->meta->set_metadata($self->status_name, "error");
257 :     $self->set_running("no");
258 :    
259 :     croak "$0: $msg";
260 :     }
261 :    
262 :     sub warning
263 :     {
264 :     my($self, $msg) = @_;
265 :    
266 :     $self->meta->add_log_entry($self->job_name, ['warning', $msg]);
267 :    
268 :     carp "$0: $msg";
269 :     }
270 :    
271 :     1;

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3