• Publicidad

Correr script de Perl como daemon

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Re: Correr script de Perl como daemon

Notapor jcovenas » 2012-04-02 11:21 @514

¡Hola!
Excelente. Tengo trabajando mi servicio.
Resumiendo, los errores eran
1. No usar print() en un servicio pues no tenemos terminal
2. La ruta no estaba bien en mi script bash; decía /usr/sbin pero estaba en /usr/bin
3. No corrí de manera correcta el update-rc.d

Tengo una consulta adicional:
como el modem es usb, al momento de reiniciar pierdo los permisos. Entonces debo ejecutar:
sudo chmod o+rw /dev/ttyUSB0
¿Cómo hago para mantener este permiso al reiniciar?

Una pregunta mas, ¿cómo hago para colocar resuelto en mi post?
jcovenas
Perlero nuevo
Perlero nuevo
 
Mensajes: 13
Registrado: 2012-03-29 11:21 @514

Publicidad

Re: Correr script de Perl como daemon

Notapor explorer » 2012-04-02 11:36 @525

Lo del modem se puede solucionar de varias formas...

  • Hacer que el grupo al que pertenece el usuario que ejecuta el servidor, sea uno de los grupos permitidos para acceder al modem. Es un tema de permisos y de modificar el fichero /etc/group
  • Poner la acción de chmod en alguno de los scripts de arranque, que se ejecuten antes de el del lanzamiento del servidor. El que uno se ejecute antes que los demás se resuelve con los números de sus enlaces en rcX.d/, o incorporando una entrada en la línea Required-Start:
  • Si es un Linux moderno, tendrá instalado el sistema udev o autofs. Con el udev se puede configurar una regla para que modifique los permisos del dispositivo una vez que aparezca conectado al sistema.

La última opción es la mejor, ya que podrás conectar y desconectar el modem las veces que quieras, y sabes que cuando le conectes, siempre lo hará con los permisos correctos.

De momento, la primera es la más sencilla, desde luego.

Para marcar un mensaje como RESUELTO, te vale con pulsar el botón "Aceptar respuesta" en la caja del mensaje que resuelve el problema planteado. El botón está en la parte superior derecha de cada mensaje.
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: Correr script de Perl como daemon

Notapor jcovenas » 2012-04-03 10:00 @458

Mi problema es colocar permisos sobre modem:
Sintáxis: [ Descargar ] [ Ocultar ]
  1. $ ls -l /dev/ttyUSB0 
  2. crw-rw---- 1 root dialout 188, 0 2012-04-02 22:10 /dev/ttyUSB0 


Mire las características del modem:
Sintáxis: [ Descargar ] [ Ocultar ]
  1. $ lsusb 
  2. Bus 002 Device 010: ID 12d1:1003 Huawei Technologies Co., Ltd. E220 HSDPA Modem / E270 HSDPA/HSUPA Modem 


Creé una regla udev para poder darle permisos; así mi servidor web puede leer el directorio.
Sintáxis: [ Descargar ] [ Ocultar ]
  1. $ sudo gedit /etc/udev/rules.d/ttyUSB0-E156B 


La regla escrita es:
SUBSYSTEMS=="usb", DRIVERS=="usb", ATTR{manufacturer}=="HUAWEI Technology", ATTR{product}=="HUAWEI Mobile", MODE = "777"

pero no sucede nada.

Ya me ha ayudado mucho. ¿Podría, por favor, ayudarme a aplicar uno de los 3 métodos?
Muchas Gracias, explorer.
jcovenas
Perlero nuevo
Perlero nuevo
 
Mensajes: 13
Registrado: 2012-03-29 11:21 @514

Re: Correr script de Perl como daemon

Notapor explorer » 2012-04-03 16:44 @738

No conozco mucho de udev, así que poco puedo ayudarte.

Creo que el ATTR{manufacturer} y el ATTR{product} están mal: no coinciden, sobre todo las mayúsculas y minúsculas.

En mi ordenador (OpenSuSE 12.1 Linux), tengo una regla así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
# Huawei E220, E230, E270, E870
ATTRS{idVendor}=="12d1", ATTRS{idProduct}=="1003", RUN+="usb_modeswitch '%b/%k'"
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Como ves, depende de los códigos USB que el producto devuelve, en lugar del nombre de la empresa. Y la regla activa la ejecución de un pequeño script llamado usb_modeswitch, que se encarga de cargar el módulo kernel de soporte de usb en el sistema.

No encuentro ejemplos de cómo cambiar los permisos, una vez creado el dispositivo.

Cuando enchufas el dispositivo o reinicias el sistema, ¿a qué usuario/grupo pertenece? ¿Al root/root?
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: Correr script de Perl como daemon

Notapor jcovenas » 2012-04-03 16:56 @747

Lo que hice fue
Sintáxis: [ Descargar ] [ Ocultar ]
  1. sudo gedit /etc/group 

dentro busqué la línea del grupo dialout que es la que gestiona el modem y escribí

,www-data

grabé, salí, reinicié yyyy...

FUNCIONÓ. ¡YÉEEEEEEEEEEEEEEEEE!
jcovenas
Perlero nuevo
Perlero nuevo
 
Mensajes: 13
Registrado: 2012-03-29 11:21 @514

Re: Correr script de Perl como daemon

Notapor explorer » 2012-04-03 19:54 @871

Sí, ¡je, je!, esa era mi primera solución. La más sencilla y directa. :wink:

Enhorabuena.
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: Correr script de Perl como daemon

Notapor jcovenas » 2012-12-19 09:23 @432

Hola, ahora he retomado el tema para poder pasar este servicio sms-gatheway a otro Linux (Alpine),
pero me encuentro que no puedo usar el File::Pid, un módulo de Perl, pero al parecer sí puedo usar POSIX.

¿Cómo podría implementar este script como dæmon?
Trato de usar el POSIX. Me dieron un ejemplo y pensé que se podía usar así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use warnings;
  3. use strict;
  4. use Net::POP3;
  5.  
  6.  
  7. use POSIX;
  8. POSIX::setsid or die "setsid: $!";                              # disociar de la terminal
  9.    my $pid = fork ();                                              # ¡fork!
  10.    if ($pid < 0) {                                                 # si ha fallado el fork...
  11.       die "fork: $!";                                              # nos morimos... algo raro pasó
  12.    } elsif ($pid) {                                                # pero, si somos el padre
  13.       exit 0;                                                      # nos morimos...
  14.    }                                                               # sigue el hijo
  15.    chdir "/";                                                      # cambio de directorio de trabajo
  16.  
  17.    umask 0;                                                        # máscara de creación de archivos a 0
  18.    foreach (0 .. (POSIX::sysconf (&POSIX::_SC_OPEN_MAX) || 1024))  # cerramos todos los gestores
  19.       { POSIX::close $_ }                                          # que pudieran estar abiertos
  20.    open (STDIN,  "</dev/null");                                    # cerramos la entrada estándar
  21.    open (STDOUT, ">/dev/null");                                    # y la salida estándar
  22.    open (STDERR, ">&STDOUT"  );                                    # y la salida estándar de errores
  23.  
  24.  
  25.  
  26.  
  27. #Variables Generals
  28. my $ServerName = "mail";
  29. my $UserNameG = "user";
  30. my $UserNameA = "user1";
  31. my $Password = "Clave";
  32. #my @CelCD = ('996135835','985573207','996308079','984922695','944814800','999220055');
  33. my @CelCD = ('942445991');
  34.  
  35. # Call to process
  36.  
  37. while('TRUE')
  38. {
  39. #print " Waiting for email...\n";
  40. SMSGeneral;
  41.  
  42. }
  43.  
  44. # Process Gatheway General
  45. sub SMSGeneral
  46. {
  47.         #print "Waiting for email...\n";
  48.         # Connect to pop3 server
  49.         my $pop3 = Net::POP3->new($ServerName) || die "Error : Couldn't log on to server";
  50.         # Login to pop3 server
  51.         my $Num_Message = $pop3->login($UserNameG,$Password);
  52.         my $Messages = $pop3->list();
  53.         # Variables Locals
  54.         my ($MsgId, $MsgDate, $MsgFrom, $MsgTo, $MsgCc, $MsgSub);
  55.         my ($MsgAttach, $MsgSize, $MsgHeader, $MsgHeadFlg, $MsgBody,$MsgNo);
  56.         # proces each message
  57.         foreach $MsgNo (keys %$Messages)
  58.         {
  59.                 my $MsgContent = $pop3->get($MsgNo);
  60.                 my $count = 0;
  61.                 $MsgHeadFlg = 0;
  62.                 $MsgBody = "";
  63.                 $MsgSize = $pop3->list($MsgNo);
  64.                 # Process message data
  65.                 while()
  66.                 {
  67.                         # Exit if last line of mail
  68.                         if ($count >= scalar(@$MsgContent))
  69.                         {
  70.                                 $MsgBody =~s/^\s*(.*?)\s*$/$1/;
  71.                                 $MsgBody = "SMS de-$MsgFrom:" . $MsgBody;
  72.                                 #  check if Subj is Numeric
  73.                                 if ($MsgSub =~ /^[+]?\d+$/ )
  74.                                 {
  75.                                         # You can only send SMS in chunks of 160 chars Max according to Gammu.
  76.                                         # so breaking the body into chunks of 160 and sending them 1 at a time.
  77.                                         my @stringChunksArray = ($MsgBody =~ m/(.{1,160})/gs);
  78.                                         for(my $i=0;$i<@stringChunksArray;$i++)
  79.                                         {
  80.                                                 open(Gammu, "| gnokii  --sendsms $MsgSub") || die "Error starting gnokii failed: $!\n";
  81.                                                 # Start gnokii and wait for the SMS body
  82.                                                 print Gammu $stringChunksArray[$i];
  83.                                                 # Print the SMS body in 160 Char chunks
  84.                                                 close(Gammu);
  85.                                                  # This is there so that the phone gets time to reset after each message. Otherwise the send fails
  86.                                                 sleep(10);
  87.                                         }#end for sms chunks
  88.                                 }
  89.                                 else
  90.                                 {
  91.                                         #print "no es un Cel";
  92.                                         # if not is number exit while
  93.                                         last;
  94.                                 }
  95.                                 # before send sms exit
  96.                                 last;
  97.                         }
  98.                         # Check if end of mail header
  99.                         if (@$MsgContent[$count] =~ /^\n/)
  100.                         {
  101.                                 $MsgHeadFlg = 1;
  102.                         }
  103.                         # Proceed if message header not processed
  104.                         if (not $MsgHeadFlg)
  105.                         {
  106.                                 # Split the line
  107.                                 my @LineContent = split /: /, @$MsgContent[$count];
  108.                                 # Check Header Info
  109.                                 SWITCH:
  110.                                 {
  111.                                         # Get message date
  112.                                         $LineContent[0] =~ /Date/i && do
  113.                                         {
  114.  $MsgDate = $LineContent[1];
  115.                                                 # print "Date : $MsgDate";
  116.                                                 last SWITCH;
  117.                                          };
  118.                                         # Get message id
  119.                                         $LineContent[0] =~ /Message-ID/i && do
  120.                                         {
  121.                                                 $MsgId = $LineContent[1];
  122.                                                 # print "Message ID : $MsgId";
  123.                                                 last SWITCH;
  124.                                         };
  125.                                         # Get message from
  126.                                         $LineContent[0] =~ /From/i && do
  127.                                         {
  128.                                                 $MsgFrom = $LineContent[1];
  129.                                                 # $MsgFrom = $1;
  130.                                                 $MsgFrom =~ s/"|<.*>//g;
  131.                                                 $MsgFrom = substr($MsgFrom, 0, 39);
  132.                                                 # print "From : $MsgFrom";
  133.                                                 last SWITCH;
  134.                                         };
  135.                                         # Get message to
  136.                                         $LineContent[0] =~ /To/i && do
  137.                                         {
  138.                                                 $MsgTo = $LineContent[1]; #print "To : $MsgTo";
  139.                                                 last SWITCH;
  140.                                         };
  141.                                         # Get message cc
  142.                                         $LineContent[0] =~ /Cc/i && do
  143.                                         {
  144.                                                 $MsgCc = $LineContent[1]; # print "Cc : $MsgCc";
  145.                                                 last SWITCH;
  146.                                         };
  147.                                         # Get message subject
  148.                                         $LineContent[0] =~ /Subject/i && do
  149.                                         {
  150.                                                 $MsgSub = $LineContent[1];# print "Subject : $MsgSub";
  151.                                                 last SWITCH;
  152.                                         };
  153.                                 }
  154.                         }
  155.                         else
  156.                         {
  157.                                 # Process message body
  158.                                 $MsgBody .= @$MsgContent[$count];
  159.                         }
  160.                         $count++;
  161.                 } #end while, end proces message
  162.                 $pop3->delete ($MsgNo); # despues de procesarlo: eliminarlo
  163.         } #end foreach, end process all message of server
  164.         # Disconnect from pop3 server
  165.         $pop3->quit();
  166.         sleep(20);                              # Sleep for 20 seconds
  167. }# fin de rutina SMS general
  168.  
Coloreado en 0.007 segundos, usando GeSHi 1.0.8.4
jcovenas
Perlero nuevo
Perlero nuevo
 
Mensajes: 13
Registrado: 2012-03-29 11:21 @514

Re: Correr script de Perl como daemon

Notapor explorer » 2012-12-19 11:32 @522

Los pasos que has puesto corresponden a los indicados en mi subrutina daemonizar() que está en la página anterior a ésta, en este mismo tema.

¿Qué es lo que no te funciona?

Veo que en la línea 80 llamas al gnokii sin indicar una ruta a ese ejecutable. Recuerda que los dæmon muchas veces no tienen un $PATH instalado, por lo que a veces no encontrará la ruta a los ejecutables. Por eso es mejor poner la ruta absoluta.

¿La actividad POP la puedes seguir en el registro de actividad (log) del sistema? Si hay errores de acceso por POP, ahí quedarán registrados.
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

Anterior

Volver a Básico

¿Quién está conectado?

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