• Publicidad

Nohup no funciona

Así que programas sin strict y las expresiones regulares son otro modo de hablar. Aquí encontrarás respuestas de nivel avanzado, no recomendable para los débiles de corazón.

Nohup no funciona

Notapor Xenon » 2019-03-17 17:18 @762

Buenas noches.

Tengo una cuestión que para mi es algo difícil de resolver.

Tengo un script que llegado el momento lanza otro script en segundo plano con el comando nohup. Este segundo script es un monitoreo constante de una carpeta. Lo curioso de este script es que si lo lanzo en primer plano, funciona perfectamente y me lanza mensajes por la salida estándar de lo que en esa carpeta ocurre, pero si lo lanzo con nohup, no hace nada.

No sé cómo hacer que este script se ejecute en segundo plano realizando lo que tiene que realizar.

La llamada que hago es la siguiente:
Sintáxis: [ Descargar ] [ Ocultar ]
  1. nohup perl mon_carpet.pl > salida_prueba.txt > /dev/null 2>&1 & 

y el script a ejecutar es este:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -w
  2. use strict;
  3. use Linux::Inotify2;
  4.  
  5. my $inotify = new Linux::Inotify2;
  6. my $fecha   = qx(date);
  7. while (1) {
  8.     $inotify->watch(
  9.         "CARPETA_PARA_MORITOREAR",
  10.         IN_ACCESS | IN_MODIFY | IN_CREATE,
  11.         sub {
  12.             my $e = shift;
  13.  
  14.             #printf "events for <%s> received: %s\n", $e->fullname, $e->mask;
  15.             #print "$e->{w}{name}  $fecha fue accedido\n" if $e->IN_ACCESS;
  16.             #print "$e->{w}{name}  $fecha fue modificao\n" if $e->IN_MODIFY;
  17.             print "$e->{w}{name}  $fecha fue creado \n" if $e->IN_CREATE;
  18.  
  19.             #print "$e->{w}{name} is no longer mounted\n" if $e->IN_UNMOUNT;
  20.             #print "events for $e->{w}{name} have been lost\n" if $e->IN_Q_OVERFLOW;
  21.  
  22.             $e->w->cancel;
  23.         }
  24.     );
  25.  
  26.     $inotify->poll;
  27. }
  28.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


A ver si sabéis qué es lo que ocurre o cómo solucionarlo. Muchas gracias.
Xenon
Perlero nuevo
Perlero nuevo
 
Mensajes: 9
Registrado: 2019-02-21 17:09 @756

Publicidad

Re: Nohup no funciona

Notapor explorer » 2019-03-17 18:47 @824

El comando nohup no sirve para lanzar procesos en segundo plano, sino para evitar que el proceso termine cuando se envíe el la señal de terminación a los procesos, por ejemplo cuando la sesión termina con un logout. Es para dejar funcionando procesos aún cuando cerremos la sesión.

De la línea de comandos que has puesto, lo que no me gusta es la parte "> /dev/null"

Con esto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
nohup perl mon_carpet.pl > salida_prueba.txt 2>&1 &
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

nos aseguramos que la salida estándar y la salida estándar de error terminen en el archivo salida_prueba.txt.

Hummm... ¿por qué $fecha está fuera del bucle? ¿Y si pasa un día entero?
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Nohup no funciona

Notapor Xenon » 2019-03-18 15:21 @681

Cierto es que $fecha debe de ir dentro del bucle, pero la cosa es que no funciona si lo ejecuto mediante nohup, no sé por qué es.
Xenon
Perlero nuevo
Perlero nuevo
 
Mensajes: 9
Registrado: 2019-02-21 17:09 @756

Re: Nohup no funciona

Notapor explorer » 2019-03-18 16:33 @731

¿Y has probado el cambio que te he propuesto?
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Nohup no funciona

Notapor Xenon » 2019-03-19 13:34 @607

Sí, pero es que creo que no estoy entendiendo bien esto. He borrado todo el contenido del script, he puesto
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. print "HOla Mundo";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

y lo he ejecutado con la línea que me has dicho, y entro en el fichero y no aparece absolutamente nada. Por lo que creo que no estoy entendiendo lo que hace esto. Creía que las salidas que el script diera se guardaban en ese fichero, pero no lo hace.

¿Qué es lo que falla?
Xenon
Perlero nuevo
Perlero nuevo
 
Mensajes: 9
Registrado: 2019-02-21 17:09 @756

Re: Nohup no funciona

Notapor explorer » 2019-03-19 14:40 @653

Pues... no lo sé, porque a mi sí que me funciona:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
explorer@Arcanus:~/Documentos/Desarrollo > head -n 5 kk.pl
#!/usr/bin/env perl

print scalar(localtime), ": Hola mundo\n";

__END__
explorer@Arcanus:~/Documentos/Desarrollo > nohup perl kk.pl > salida.txt 2>&1
explorer@Arcanus:~/Documentos/Desarrollo > cat salida.txt
nohup: no se tendrá en cuenta la entrada
Tue Mar 19 20:36:08 2019: Hola mundo
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Observa que salida.txt captura la salida estándar de error generado por nohup.

Si quitamos el redireccionamiento del error, saldrá en pantalla, mientras que el resto se enviará al archivo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
explorer@Arcanus:~/Documentos/Desarrollo > nohup perl kk.pl > salida.txt
nohup: se descarta la entrada y se redirige la salida de error a la salida estándar
explorer@Arcanus:~/Documentos/Desarrollo > cat salida.txt
Tue Mar 19 20:39:03 2019: Hola mundo
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Nohup no funciona

Notapor Xenon » 2019-03-19 16:01 @709

Sí, tienes razón, funciona sin problemas, lo que no me funciona es el script que usa inotify: hace caso omiso y solo quiero que me muestre un mensaje cuando se cree algo en la carpeta especificada, pero no lo hace si uso el nohup, pero en cambio sí si lo hago en primer plano.
Xenon
Perlero nuevo
Perlero nuevo
 
Mensajes: 9
Registrado: 2019-02-21 17:09 @756

Re: Nohup no funciona

Notapor explorer » 2019-03-19 17:49 @784

HUmmm... lo que quieres es recibir de forma inmediata un cambio en el archivo de texto en cuanto se produce un evento...

Bueno, el problema está en otro sitio.

Por defecto, toda escritura a archivo (y salidas y entradas estándares) está con el búfer activado. Esto se hace para que sean más óptimas las E/S con los dispositivos de almacenamiento, como los discos duros.

Pero este no es tu caso. Quieres que haya cambios en el archivo de registro de forma inmediata.

Lo que tienes que hacer es poner esta línea al principio de tu programa Perl, después de los 'use'.

$| = 1; # elimina búfer en la salida

Eso elimina el uso del búfer de salida, por lo que todos los print hacia el exterior se mostrarán de forma inmediata.

Más información en perldoc perlvar (buscar por $|).
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Nohup no funciona

Notapor Xenon » 2019-03-20 14:49 @659

Perfecto, eso era lo que necesitaba. Muchísimas gracias.

Otra cuestión: envío desde perl el siguiente comando que ya conoces desde un script para ejecutar otro script y que no acabe.

qx("nohup perl mon_carpet.pl argumentos > salida_prueba.txt 2>&1 &");

¿Hay alguna forma de capturar el PID en Perl de ese lanzamiento? He visto que en Bash se utilizaría el $!, pero en Perl lo he probado y no funciona. He probado también asignar el qx(nohup...) a una variable, pero no devuelve nada.

Muchas gracias.
Xenon
Perlero nuevo
Perlero nuevo
 
Mensajes: 9
Registrado: 2019-02-21 17:09 @756

Re: Nohup no funciona

Notapor explorer » 2019-03-20 18:16 @803

El PID de un proceso está guardado en la variable $$ (más información en perldoc -v '$$').

Una vez que el proceso sepa cuál es su PID, lo normal es que lo transmita hacia afuera de alguna manera. Muchos programas dejan su PID en /var/run/, pero tu puedes escoger dónde y de qué forma quieres recogerlo.

qx() no devuelve nada porque

a) la salida está siendo almacenada en salida_prueba.txt
b) si hubiera otra salida, sería almacenada en el archivo que crea nohup

Podrías quitar "2>&1" y enviar el pid por la salida estándar de error. Pero es mucho más fácil abrir un archivo y guardarlo ahí.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Avanzado

¿Quién está conectado?

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