• Publicidad

Cargar variable de entorno

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Cargar variable de entorno

Notapor monykpb » 2007-01-16 05:34 @273

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.003 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
monykpb
Perlero nuevo
Perlero nuevo
 
Mensajes: 1
Registrado: 2007-01-16 05:25 @267

Publicidad

Notapor explorer » 2007-01-16 12:11 @549

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.003 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.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor creating021 » 2007-01-17 15:51 @702

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
Expect the worst, is it the least you can do?
Avatar de Usuario
creating021
Perlero frecuente
Perlero frecuente
 
Mensajes: 595
Registrado: 2006-02-23 16:17 @720
Ubicación: Frente al monitor

Notapor explorer » 2007-01-17 17:31 @771

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.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor creating021 » 2007-01-17 19:06 @837

:| 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.
Expect the worst, is it the least you can do?
Avatar de Usuario
creating021
Perlero frecuente
Perlero frecuente
 
Mensajes: 595
Registrado: 2006-02-23 16:17 @720
Ubicación: Frente al monitor

Memoria compartida entre procesos

Notapor Moraita » 2009-01-30 05:53 @287

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!!!
Moraita
Perlero nuevo
Perlero nuevo
 
Mensajes: 36
Registrado: 2008-10-29 10:25 @475

Notapor explorer » 2009-01-30 08:18 @387

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.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Intermedio

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 2 invitados

cron