• Publicidad

Cómo puedo modificar el crontab en Unix con Perl

¿Eres administrador de sistemas? Este foro es para todos aquellos temas relacionados con el uso de Perl para administración de sistemas.

Cómo puedo modificar el crontab en Unix con Perl

Notapor kaptincho » 2013-11-09 17:51 @785

Hola amigos, estoy creando un script y necesito mantener actualizado el crontab con diferentes trabajos.

Estoy utilizando:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $copia = `crontab -u apache /var/www/cronjobs.txt`;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

para actualizar el archivo /var/spool/cron/apache pero al reiniciar el sistema éste se pone con privilegios de root, por lo tanto parece que no se actualiza desde el script que corre vía web con privilegios de Apache.

¿Cómo podría actualizar y hacer refresh al crontab?
kaptincho
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2013-11-09 14:44 @655

Publicidad

Re: Cómo puedo modificar el crontab en Unix con Perl

Notapor explorer » 2013-11-10 07:18 @346

Primero de todo: ¿existe un usuario llamado "apache" en tu sistema y tiene como ruta home /var/www/? Comprueba si está en /etc/passwd... En mi Debian, ese usuario se llama www-data.

Luego... comprueba si existe el archivo /etc/cron.allow. Si existe, los usuarios que pueden ejecutar crontab deberán estar listados allí. Si no existe, comprueba si existe /etc/cron.deny. Si existe, los usuarios que no pueden ejecutar crontab deberán estar listados allí. Más información en man 1 crontab.

Luego... el archivo cronjobs.txt deberá tener permisos de lectura/escritura para tu script por parte del usuario que ejecuta ese script. Si es el Apache, entonces estamos hablando de un CGI, así que el Apache deberá tener permisos para entrar a esa carpeta y leer y modificar ese archivo.

Luego... averigua la posición de crontab en tu sistema:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. # which crontab
  2. /usr/bin/crontab
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Esa es la ruta completa que usarás en el código, en lugar de solo 'crontab'.

La clave está en '-u apache'. Con eso estamos indicando que queremos actualizar la lista de trabajos del usuario 'apache'. El crontab lo guardará en /var/spool/cron/crontabs, y cuando llegue el principio del minuto siguiente, lo leerá y comenzará a ejecutar. El dejarlo en /var/spool/cron/crontabs garantiza que, después de un reinicio del sistema, crontab sepa qué tareas debe seguir realizando.

El directorio /var/spool/cron/crontab tiene estos permisos/propiedad:

drwx-wx--T 2 root crontab 4096 abr 10 2013 crontabs

Así que sí: el directorio es propiedad del root por que se supone que los archivos que hay dentro solo deben ser accedidos a través del comando crontab.
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: Cómo puedo modificar el crontab en Unix con Perl

Notapor kaptincho » 2013-11-10 11:21 @515

¡Gracias, explorer!

Lo que hice fue comprobar que el usuario apache sí existe, es el usuario que corre el httpd, lo comprobé corriendo print `id` desde la web (cgi). Entonces lo que hice fue system 'crontab /path/path/nuevocron.txt' y al parecer ahora se actualiza bien dentro de spool/cron/.

¡Gracias!
kaptincho
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2013-11-09 14:44 @655

Re: Cómo puedo modificar el crontab en Unix con Perl

Notapor lmol45 » 2015-10-26 10:53 @495

Hola, quiero consultar: ¿se puede en un crontab tener un script que haga una inserción en una base de datos?
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. */5 * * * * perl /root/scriptEjecutar.pl
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

He probado a hacer el llamado desde un bash, agregándole permisos de root pero aun así no me aparece ninguna inserción. Sin embargo reviso el log de crontab, aparece que se está ejecutando en el periodo de tiempo establecido.
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. */5 * * * * root perl /root/scriptEjecutar.pl
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. */5 * * * * root /root/ejecutar.sh
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

¿Las crontab tienen limitantes? Si no es así, ¿qué debe configurarse para que pueda realizar inserciones en una base de datos desde Perl?

Gracias de antemano por responder.
lmol45
Perlero nuevo
Perlero nuevo
 
Mensajes: 8
Registrado: 2015-09-11 12:27 @560

Re: Cómo puedo modificar el crontab en Unix con Perl

Notapor explorer » 2015-10-27 17:11 @758

No, crontab no impone límites.

Debes tener en cuenta que un programa arrancado de este modo, por defecto, puede arrancar en un usuario que quizás no tenga permisos para acceder a determinados archivos/directorios. Como veo que tienes puesto a 'root', entonces se supone que sí tienes acceso a todo.

Otro tema importante: cuando arranca el programa, no debes asumir que se está ejecutando en un determinado directorio. Si tu programa depende de la posición de un archivo/directorio, pues lo primero que debe hacer es un chdir() para colocarse en el sitio correcto.

Si no se trata de nada de esto, hay que averiguar en qué parte del programa falla. Puedes sacar texto por la salida estándar de error, que el crontab mandará por correo electrónico al root. Mira su buzón de correo, pues ahí tendrás la respuesta.

Si no ves nada, abre un archivo de texto al principio del programa, y vas imprimiendo la posición del programa que se va ejecutando. Así deberías saber dónde falla.

Si el problema está en la base de datos, eso es más raro: lo normal es que la abras con las credenciales adecuadas, independiente del usuario que ejecuta el programa. De todas maneras, el motor de la base de datos también puede tener un log donde puede quedar reflejado lo que ha pasado.
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: Cómo puedo modificar el crontab en Unix con Perl

Notapor lmol45 » 2015-10-28 10:39 @485

Sí hice la prueba para revisar qué estaba generando.
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. sudo perl /root/Prueba.pl
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Genera la inserción de manera correcta y sin ningún retraso ni error.

Al generar la tarea programada con el script tuve como resultado realizar el acceso con las credencias y que toman el insert de MySQL sin error, pero en el execute() no da resultado.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. ## Conectarse a la base de datos
  2. ##
  3. my $dsn = "DBI:mysql:database=$dbname;host=$dbhost;port=3306";
  4. $dbh = DBI->connect($dsn, $dbuser, $dbpwd) or die "Error de conexion: $DBI::errstr";
  5.  
  6. ## Preparar la sentencia de inserción en la base de datos
  7. $sth = $dbh->prepare("INSERT into tblclasificacion (`Cadena`, `NroDispositivo`, `Fecha`) VALUES(?,?,?,)") or die "Couldn't prepare query: ".$dbh->errstr;
  8.  
  9. ## Insertar un registro en la tabla
  10. my $n = $sth->execute($almacenamiento, $nroDispositivo, $fecha);
  11.  
  12. ## Desconectarse de la base de datos
  13. ##
  14. $sth->finish();
  15. $dbh->disconnect();
  16. if (! $dbh->disconnect) {
  17.         warn "Error al desconectarse de la base de datos: $DBI::errstr";
  18. }
  19.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


A pesar de esto la tarea aparece en el log/cron con que se ejecutó, pero cuando llega a la línea del execute() se la salta.
lmol45
Perlero nuevo
Perlero nuevo
 
Mensajes: 8
Registrado: 2015-09-11 12:27 @560

Re: Cómo puedo modificar el crontab en Unix con Perl

Notapor explorer » 2015-10-28 11:47 @532

Agrega un or die $sth->errstr al final del execute(), para capturar posibles errores.

La línea 15 te sobra (fíjate que la estás ejecutando dos veces).

Y la línea 14 (finish()) también la puedes quitar. De hecho, la documentación lo recomienda.
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: Cómo puedo modificar el crontab en Unix con Perl

Notapor lmol45 » 2015-10-29 17:22 @765

Gracias. Hice las últimas pruebas y ya está funcionando. ¡Gracias por la ayuda! :D
lmol45
Perlero nuevo
Perlero nuevo
 
Mensajes: 8
Registrado: 2015-09-11 12:27 @560


Volver a Administración

¿Quién está conectado?

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