OT: Subproceso hijo con modperl
NYARLATHOTEP El Caos Reptante
nyarlathotep.elcaosreptante en gmail.com
Vie Nov 11 19:01:11 CLST 2005
Bueno, hace unos dias comente un problema que tenia con mod_perl y
procesos hijos... lo he solucionado y posteo lo que he realizado por
si alguien tiene el mismo problema...
aqui va:
modificaciones al metodo del archivo .pm
sub generar_info {
my $self = shift;
my $arg = "ACT" if param("ACT");
$arg = "CHB" if param("CHB");
$arg = "CHL" if param("CHL");
$arg = "INTER" if param("INTER");
$arg = "REENV" if param("REENV");
$arg = "REINT" if param("REINT");
warn "Generando Info...\n";
use strict;
use POSIX 'setsid';
use Apache::SubProcess;
$ENV{'PATH'} = '/bin:/usr/bin';
delete @ENV{'IFS','CDPATH','ENV','BASH_ENV'};
my $r = Apache->request;
$SIG{CHLD} = 'IGNORE';
defined (my $kid = fork) or die "Cannot fork: $!\n";
if ($kid == 0) {
warn "Preparando proceso hijo!\n";
$r->cleanup_for_exec(); # untie the socket
chdir '/' or die "Can't chdir to /: $!";
open STDIN, '/dev/null' or die "Can't read /dev/null: $!";
open STDOUT, '>/tmp/padre.log' or die "Can't write /dev/null: $!";
open STDERR, '>&STDOUT' or die "Can't dup stdout: $!";
setsid or die "Can't start a new session: $!";
warn "Ejecutando Proceso Hijo desde ahora, ya!\n";
warn "Con los siguientes parametros $arg\n";
warn "Ejecutando /desa/fosis/bin/generador_archivos_inp.pl\n";
system ("/desa/my_site/bin/generador_archivos.pl", $arg) or die
"Can't system: $!";
CORE::exit(0); # terminate the process
}
}
Segundo... el archivo externo
(/desa/my_site/bin/generador_archivos.pl) lo he modificado de la
siguiente forma en sus lineas iniciales:
#!/usr/bin/perl
my $tipo_tx = shift @ARGV;
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
$year += 1900;
$mon++;
my $archivo = "pagos_inp_$tipo_tx-$year-$mon-$mday-$hour-$min.txt";
open STDIN, '/dev/null' or die "Can't read /dev/null: $!";
open STDOUT, ">/desa/my_site/htdocs/bono/archivo_$tipo_tx-$year-$mon-$mday-$hour-$min.txt"
or die "Can't open folder bono to write";
open STDERR, '>/tmp/log' or die "Can't write /dev/null: $!";
my $oldfh = select STDERR;
local $| = 1;
select $oldfh;
warn "Y comenzamos!\n";
warn "Tipo de Tx = $tipo_tx\n";
#aqui sigue el resto del codigo, donde se manipula la informacion de
la base de datos, se realizan calculos, uso de regex, etc....
Bueno, eso es todo...
Si alguien tiene una idea de como realizar esto de forma mas
eficiente, es bienvenido...
P.D: estuve 3 dias peleando con el ladrillo de libro 'Practical
mod_perl', y tambien tuve errores de escribir /dev/null/ (lo cual lo
asume como directorio) entre otros....
--
No trate nunca de verificar una condición de error que no sepa manejar.
Más información sobre la lista de distribución Linux