Página 1 de 1

Cargar variable de entorno

NotaPublicado: 2007-01-16 05:34 @273
por monykpb
Quisiera hacer un script en Perl que se inicie al arrancar la máquina Linux para cargar algunas variables de entorno, tales como PATH o PERL5LIB, pero no consigo que funcione.
Lo he intentado haciendo:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$path=`env|grep -e "^PATH"`;
@p=split /=/,$path;
system("PATH=$JAVA_HOME/bin:$p[1]");
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


También lo he intentado así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$ENV{PATH}=<unaRuta>;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Ejecuto el script y después miro el valor de la variable PATH y no ha sido modificado.
¿Alguien puede ayudarme?
Muchas gracias

NotaPublicado: 2007-01-16 12:11 @549
por explorer
Bienvenido a los foros de Perl en Español.

Las variables pierden su valor en cuanto termina el contexto que las manipula.

Para que mantengan su valor, han de ser exportadas. Por eso, en bash, se usa el comando export para exportar las variables a los contextos que hereden el contexto actual.
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
export PATH=$JAVA_HOME/bin:$PATH
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

En la siguiente pregunta de la faq8 también te dicen de otra manera: que el entorno de un proceso padre no puede ser cambiado por un proceso hijo.

Lo que sí se puede hacer es lo que te dicen en la faq8: evaluar la salida del script en el shell:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
explorer@casa:~> export CASA=$(perl -e 'print "CHUZ"')
explorer@casa:~> echo $CASA
CHUZ
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
En Bash shell, lo que suele hacer es ejecutar el script con "." o con "source" para que el script hijo sea en realidad evaluado en el contexto del padre, no que bash cree un fork de sí mismo para que ejecute al hijo, pues en este caso las variables modificadas por el hijo no pasarán al padre, al morir más tarde el fork del hijo.

Más info en la pregunta 2.8 de comp.unix.questions.

NotaPublicado: 2007-01-17 15:51 @702
por creating021
Tambén se puede usar el comando env (ejecuta info env en la terminal y no leas el manual que no está implementado) .

Mira esto:
http://search.cpan.org/~nwclark/perl-5.8.8/lib/Env.pm

NotaPublicado: 2007-01-17 17:31 @771
por explorer
El comando env sirve para modificar el entorno de un programa que se va a ejecutar en ese momento y sólo en ese momento:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
explorer@casa:~> env CASA="CHUZ" perl -le 'print $ENV{CASA}'
CHUZ
explorer@casa:~> echo $CASA

explorer@casa:~>
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Qué es lo mismo que escribir en bash:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
explorer@casa:~> CASA="CHUZ" perl -le 'print $ENV{CASA}'
CHUZ
explorer@casa:~>
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
pero ese no es el problema. El problema planteado por monykpb es hacer un script que modifique el entorno actual, no el de los procesos hijo.

NotaPublicado: 2007-01-17 19:06 @837
por creating021
:| env sólo es para modificar el entorno cuando se ejecuta un comando y no una variable global.

Lo que pones de bash está claro, por eso cd no es un comando y por eso cuando haces el export desde bash se queda ahí, es lo mismo con chdir en Perl, es solo para el programa y no para la terminal.

El truco está en los archivos rc o de init que inician en un nivel suficiente bajo para hacerlo.

Memoria compartida entre procesos

NotaPublicado: 2009-01-30 05:53 @287
por Moraita
Hola,

He estado mirando el foro pero no encuentro nada concreto. Intentaré explicar la situación:

Tengo dos procesos. Uno trabaja continuamente, 'non stop', me refiero a que está siempre activo con el objetivo de mantener una conexión a servidor. Su función, entre otras cosas, es conectarse a una base de datos y ejecutar... lo que sea... El otro proceso lo que tiene que hacer es "avisar" al primero para que trabaje, es decir, no queremos que el proceso primero acceda a la base de datos continuamente para chequear ciertas cosas, sino que solo acceda cuando sea "avisado".

Otro detalle "sin importancia" es que ese primero, no es único, sino que son 8, los 8 estarán esperando su "aviso" correspondiente para atacar a la base de datos.

En fin, tengo muchas dudas de cómo implementar esto pero la primera que me surge es cómo implementar el "aviso". Tiene que ser algo rápido, por lo tanto pienso en variables globales (memoria compartida) entre procesos...

¿Alguna indicación de dónde o el qué debería estar leyendo?

¡¡¡Gracias!!!

NotaPublicado: 2009-01-30 08:18 @387
por explorer
El paso de mensajes entre procesos se puede realizar de varias maneras. Yo creo que haces referencia al System V IPC.

Tienes información sobre todas las posibilidades de intercambio de información entre procesos en el documento perlipc. Si no quieres liarte con el sistema de señales, o con la comunicación por sockets, vete directamente a la sección SysV IPC.

Naturalmente, dependerá del sistema operativo que estés usando, el que disponga de esta facilidad.

Para referencia tuya, yo tuve que hacer algo así hace unos años, pero como no era imprescindible un alto control del tiempo, la comunicación entre procesos la hice creando/borrando ficheros. En algunos casos, me valía la simple presencia o ausencia de un fichero para controlar a otro(s). En otros casos, en el fichero se indicaba algún dato. El proceso que lo leía, se encargaba también de borrar ese fichero de intercambio de mensajes.

En este otro hilo se pregunta por el sistema de cola de mensajes.