Showing posts with label bash. Show all posts
Showing posts with label bash. Show all posts

Wednesday, October 2, 2013

BASH: Buscar el día anterior al día provisto.

Este pequeño "if" es muy útil. El mismo calcula el día anterior de la fecha provista (formato YYYYmmDD) y si no se le provee ninguna automáticamente le asigna el día de hoy y el de ayer a las variables pertinentes.


#!/bin/bash

#Si el parametro $1 NO viene vacio
if [ ${#1} != 0 ]
then
        #Entonces TIMESTAMP es igual al valor de $1
        TIMESTAMP=$1

        #ONEDAYBEFORE es un dia antes del dia provisto
        ONEDAYBEFORE=$(date -d "$1 - 1 day" "+%Y%m%d")
else
        #De lo contrario TIMESTAMP sera el dia de hoy
        TIMESTAMP=`date +"%Y%m%d"`
        
        #ONEDAYBEFORE sera el dia de ayer
        ONEDAYBEFORE=`date --date="yesterday" "+%Y%m%d"`
fi

Utilidad:
Supongamos que diariamente tienes que generar un reporte que compare el día de ayer con el de hoy. La ventaja que provee este if es la flexibilidad de poder ejecutar este script tanto manual como automáticamente, osea, puedes ponerle una fecha en el pasado y obtendrá el día anterior al provisto.

Monday, June 3, 2013

BASH: Como encontrar el primer y último día del mes anterior.

Hoy tuve que hacer un script para generar un reporte que contenga información del mes pasado completo. 

Para encontrar el primer día del mes pasado utlizamos este comando:


$ date -d "$(date -d `date +%Y-%m-%d` +%Y-%m-01) -1 month" +%Y-%m-%d
2013-05-01 
Para encontrar el último día del mes pasado utlizamos este:


$ date -d "$(date -d `date +%Y-%m-%d` +%Y-%m-01) -1 day" +%Y-%m-%d
2013-05-31 
Si deseas hacerlo para el mes corriente seria de la siguiente manera:

$ date -d `date +%Y-%m-%d` +%Y-%m-01
2013-06-01
$ date -d "$(date -d `date +%Y-%m-%d` +%Y-%m-01) +1 month -1 day" +%Y-%m-%d
2013-06-30
*Esto fue probadocon BASH shell en RedHat 6

Friday, October 19, 2012

Bash Scripts no corren en crontab pero si manualmente desde el Command Line.

Pues llevo desde las 8 de la mañana tratando de decifrar porque unos scripts corren bien desde el command line pero dan error desde el crontab.

Primero verifica que el script tenga permisos de ejecución. Si los tiene puede que sea lo siguiente.

Los scripts que se ejecutan desde el crontab corren en un subshell que NO hereda los valores de tus environmental variables. Lo que significa que la variable $PATH de ese subshell solamente mira a "/usr/bin:/bin:" por lo que si estas corriendo una aplicación que depende del path de java (como en mi caso) nunca va a ejecutarse.

Esto se corrige de la siguiente manera.

1. Desde el command line buscamos el valor de la variable $PATH
# echo $PATH
PATH=/usr/lib64/qt-3.3/bin:/usr/NX/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/bin/java
2. Ahora editamos el crontab, copiamos el valor de la variable PATH y lo pegamos en la primera linea.

[root@server test]# crontab -e
PATH=/usr/lib64/qt-3.3/bin:/usr/NX/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/bin/java

#Automatic Jobs
34 10 * * * /opt/Test.sh > /opt/Job.log
01 4 * * * /opt/Test2.sh > /opt/Test.log
De esta manera nos estamos asegurando que todos los cronjobs que se corran tengan el $PATH definido.

Ya terminamos, guarda el archivo y ya está! Haz una prueba!