Página 1 de 1

Cómo puedo modificar el crontab en Unix con Perl

NotaPublicado: 2013-11-09 17:51 @785
por kaptincho
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?

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

NotaPublicado: 2013-11-10 07:18 @346
por explorer
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.

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

NotaPublicado: 2013-11-10 11:21 @515
por kaptincho
¡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!

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

NotaPublicado: 2015-10-26 10:53 @495
por lmol45
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.

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

NotaPublicado: 2015-10-27 17:11 @758
por explorer
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.

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

NotaPublicado: 2015-10-28 10:39 @485
por lmol45
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.

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

NotaPublicado: 2015-10-28 11:47 @532
por explorer
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.

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

NotaPublicado: 2015-10-29 17:22 @765
por lmol45
Gracias. Hice las últimas pruebas y ya está funcionando. ¡Gracias por la ayuda! :D