Página 1 de 1

Nohup no funciona

NotaPublicado: 2019-03-17 17:18 @762
por Xenon
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.004 segundos, usando GeSHi 1.0.8.4


A ver si sabéis qué es lo que ocurre o cómo solucionarlo. Muchas gracias.

Re: Nohup no funciona

NotaPublicado: 2019-03-17 18:47 @824
por explorer
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?

Re: Nohup no funciona

NotaPublicado: 2019-03-18 15:21 @681
por Xenon
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.

Re: Nohup no funciona

NotaPublicado: 2019-03-18 16:33 @731
por explorer
¿Y has probado el cambio que te he propuesto?

Re: Nohup no funciona

NotaPublicado: 2019-03-19 13:34 @607
por Xenon
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?

Re: Nohup no funciona

NotaPublicado: 2019-03-19 14:40 @653
por explorer
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

Re: Nohup no funciona

NotaPublicado: 2019-03-19 16:01 @709
por Xenon
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.

Re: Nohup no funciona

NotaPublicado: 2019-03-19 17:49 @784
por explorer
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 $|).

Re: Nohup no funciona

NotaPublicado: 2019-03-20 14:49 @659
por Xenon
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.

Re: Nohup no funciona

NotaPublicado: 2019-03-20 18:16 @803
por explorer
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í.