source: gs2-extensions/parallel-building/trunk/src/bin/script/poll-gsdl.pl@ 30354

Last change on this file since 30354 was 24843, checked in by jmt12, 12 years ago

A script that launches an (affinity assigned) Greenstone import while using 'ps' to monitor process use

  • Property svn:executable set to *
File size: 3.3 KB
Line 
1#!/usr/bin/perl
2
3use strict;
4use warnings;
5
6BEGIN
7{
8 die "GSDLHOME not set\n" unless defined $ENV{'GSDLHOME'};
9}
10
11# For WNOHANG flag
12use POSIX ":sys_wait_h";
13# For intervals less than 1 second
14use Time::HiRes qw(usleep gettimeofday);
15
16# Pragma to autoflush STDOUT
17$| = 1;
18
19if (!defined $ARGV[0])
20{
21 &printUsage();
22}
23my $collection = $ARGV[0];
24my $threads = 1;
25if (defined $ARGV[1])
26{
27 if ($ARGV[1] =~ /^\d+$/)
28 {
29 $threads = $ARGV[1];
30 }
31 else
32 {
33 &printUsage();
34 }
35}
36my $epoc = 100;
37if (defined $ARGV[2])
38{
39 if ($ARGV[2] =~ /^\d+$/)
40 {
41 $epoc = $ARGV[2];
42 }
43 else
44 {
45 &printUsage();
46 }
47}
48
49# Remove the current archives directory
50`rm_archives.pl $collection`;
51
52# Flush the memory disk cache
53# - save our current default editor
54my $current_editor = $ENV{'EDITOR'};
55# - replace default editor with a script that simply clobbers the contents
56# of any file it's handed with the number "3"
57$ENV{'EDITOR'} = 'reset_memcache_editor.sh';
58# - we now call sudoedit on the system file. How sudoedit works is that it
59# starts by making a temp copy of the system file with appropriate
60# permissions allowing the user to edit. It then passes the path to the
61# temp file to the default editor - typically this would be an interactive
62# editor like 'vi'. However, we've just replaced the editor with a custom
63# script that just writes '3' as the content of the tmp file. Finally, when
64# the editor exits, sudoedit copies the tmp file over the top of the system
65# file, restoring appropriate root-level permissions
66`sudoedit /proc/sys/vm/drop_caches`;
67# - restore the default editor, just in case something in Greenstone
68# depends on this being a reasonable value
69$ENV{'EDITOR'} = $current_editor;
70
71my $import_cmd = 'taskset -c 0 import.pl -keepold -manifest manifest.xml -verbosity 0 ' . $collection . ' 2>&1';
72if ($threads > 1)
73{
74 $import_cmd = 'parallel_import.pl -removeold -verbosity 0 -epoch ' . $epoc . ' -jobs ' . $threads . ' ' . $collection . ' 2>&1';
75}
76my $polling_cmd = 'ps -u jmt12 -o pid,psr,pcpu,pmem,cmd --sort pid';
77
78print "===== GS Import with PS Poll ====\n";
79
80# Forking children... get off my front lawn!
81my $child_pid = fork();
82
83# Ensure fork() worked
84if (!defined($child_pid))
85{
86 die("Fork didn't.");
87}
88
89# Parent process polls memory until child is done
90if ($child_pid > 0)
91{
92 print " - parent monitoring child process $child_pid\n";
93
94 open(POLLOUT, '>:utf8', 'memory-' . $child_pid . '.log') or die('Failed to open file for writing: memory-' . $child_pid . ".log\n");
95 my $result = 0;
96 while ($result >= 0)
97 {
98 my ($seconds, $useconds) = gettimeofday();
99 print POLLOUT '[' . $seconds . '.' . $useconds . "]\n";
100 my $result = `$polling_cmd 2>&1`;
101 print POLLOUT $result . "\n";
102 usleep(500000); # Half a second
103 # I believe result is non-zero iff the child process has completed, in
104 # which case result should be the child process id (again)
105 $result = waitpid($child_pid, WNOHANG);
106 # Watch for errors in waitpid
107 print "Result: " . $result . "\n";
108 }
109 close(POLLOUT);
110 print "===== Complete! =====\n\n";
111 exit(0);
112}
113# Child process runs import command
114else
115{
116 print " - child process running GS import\n";
117 my $result = `$import_cmd`;
118 print $result . "\n";
119 exit(0);
120}
121
122# Doubt we'll ever get here, but who knows.
123exit(0);
124
125sub printUsage
126{
127 die("Usage: poll-gsdl.pl <collection> [<threads> [<epoc>]]\n");
128}
129
1301;
Note: See TracBrowser for help on using the repository browser.