Fallo de tareas programadas en cron (ls + awk )

Hoy me ha pasado una cosa rara y todavía no se exactamente el por qué. Aunque lo estoy a investigar y Google solucionará mis dudas, como siempre, de momento dejo el post del "fallo", y lo pongo entre comillas por que no se si realmente es un fallo, que localicé en la ejecución periódica de tareas con cron.
La tarea a ejecutar es muy simple, realizo un find según unos criterios y a partir de ahí ejecuto un ls -l sobre la salida para finalmente con awk recoger el valor que me interesa. Más concretamente el código es tal que así:
find /home -size +50M -exec ls -lh {} \; | awk '{print "rm -f " $9}'
La salida obtenida es, por ejemplo, la que sigue.
shell> find /home -size +50M -exec ls -lh {} \; | awk '{print "rm -f " $9}'
rm -f /home/javier/ISO's/debian-500-i386-netinst.iso
rm -f /home/javier/ISO's/debian-502-amd64-netinst.iso
rm -f /home/javier/ISO's/ubuntu-8.04.1-server-i386.iso
rm -f /home/javier/ISO's/XenServer-5.5.0-install-cd.iso
rm -f /home/javier/ISO's/ubuntu-8.10-desktop-i386.iso
Hasta este punto todo es correcto. La salida es la esperada según el sistema y hace lo que tiene que hacer.
El problema está si con esto construimos un script que contenga esa línea y lo ejecutamos periódicamente en cron. El resultado de salida no es el que obtenemos con la ejecución manual, sino que cambio y $9, pasa a contener el valor de $8 y aparece un nuevo $10 que contiene el valor correcto. Este cambio de valores es lo que todavía no se por que sucede al ejecutarlo con cron. Por lo tanto el script para ejecutar periódicamente tendría que tener el siguiente aspecto, para que el resultado fuese el esperado.
#!/bin/bash
find /home -size +50M -exec ls -lh {} \; | awk '{print "rm -f " $10}'
En breve intentaré dar una explicación razonable al por qué de este desplazamiento de variables.


2 comentarios :

  1. Es muy curioso. Yo no soy capaz de reproducir el error (para mí siempre es $9 el correcto).

    Sugerencia: prueba a meter en el crontab un "ls" y redirigir la salida a un fichero, a ver si escribe algo distinto...

    Por otro lado, si lo que quieres es pillar el último campo, siempre puedes poner $NF y no tienes ningún problema.

    ResponderEliminar
  2. Efectivamente, eso fue lo que hice para descubrir qué era lo que pasaba. Y en mi caso puntual saber por que era $9 y no $8 lo que necesitaba coger.
    Actualizaré la entrada para comentar el motivo, pero es algo del environment de CRON que en algunos equipos es diferentes al environment del sistema.

    ResponderEliminar

Formulario de contacto

Nombre

Correo electrónico *

Mensaje *

Últimos comentarios