GNU/Linux >> Tutoriales Linux >  >> Linux

¿Bashscript funciona desde la terminal pero no desde Crontab?

Tengo un montón de CronJobs y funcionan bien, excepto uno. Revisé muchos foros y sitios web y probé una combinación de cosas, pero lamentablemente nada funcionó.

Reformulando la pregunta es:

P: El bashscript funciona sin problemas desde la terminal. Pero con el CronJob no funciona en absoluto.

Lo último que he hecho para la depuración es lo siguiente:

1) Comprobado si el Cron Daemon se está ejecutando (ps ax | grep ) =está funcionando

2) Realicé un trabajo cronológico adicional para (volver a probar) enviarme un correo electrónico cada minuto (* * * * * echo "hello" | mail -s "subject" [email protected] ) =funcionó bien

3) Ejecuté mi script bash a través de la terminal como independiente =funcionó bien

4) He comprobado grep CRON /var/log/syslog para cualquier error =se ve bien/sin errores

5) Verificación de permisos, etc. =sin problemas con los permisos

6) La ruta del archivo al script bash para el trabajo cron se ve bien

#!/bin/bash

#When adding any additional machines make sure there are two files
#within the directory. MACHINE_NAMEMACHINE_NUMBER_initial_time.txt
#and MACHINE_NAMEMACHINE_NUMBER_old_ignition_value.txt

#./engine_switch_check.txt MACHINE_NAME MACHINE_NUMBER

echo `date +%T` >> test.txt

./engine_switch_check.txt MXE 065
./engine_switch_check.txt TMX5BP 001
./engine_switch_check.txt MX3 122
./engine_switch_check.txt TMX 098

y el engine_switch_check.txt:

#!/bin/bash

mc_id="$1"        #-->eg: TMX
mc_no="$2"        #-->eg: 098
echo "$mc_id $mc_no"

#echo "1--$mc_id$mc_no-DATAFILE.txt"
mc_fname=$mc_id$mc_no'_old_ignition_value.txt'
echo $mc_fname


#old_ignition_value=$(sed -n '1p' $mc_fname)
#echo "2--$old_ignition_value"
#old_ignition_value=$(sed -n '1p' $mc_id$mc_no'DATAFILE.txt')
#echo "3--$old_ignition_value"
new_ignition_value=`get values from the terminal`
old_ignition_value=$(sed -n '1p' $mc_id$mc_no'_old_ignition_value.txt')


echo "Program name: $0"
echo "New Ignition Value: $new_ignition_value"
echo "Old Ignition Value: $old_ignition_value"
echo;echo;echo

#difference_btwn_new_old_ign_values=$(awk '{print $1-$2}' <<< "$new_ignition_value $old_ignition_value")

difference_btwn_new_old_ign_values=$(($new_ignition_value - $old_ignition_value))
#difference_btwn_new_old_ign_values= expr new_ignition_value - old_ignition_value

echo "$new_ignition_value"
echo "$old_ignition_value"
echo "$difference_btwn_new_old_ign_values"

if [ "$difference_btwn_new_old_ign_values" -lt "1" ]
then
    > $mc_id$mc_no'_initial_time.txt'
    initial_time=`date +"%s"`    
    echo $initial_time >> $mc_id$mc_no'_initial_time.txt'
fi

if [ "$difference_btwn_new_old_ign_values" -ge "5" ]
then
    final_time=`date +"%s"`
    initial_time=$(sed -n '1p' $mc_id$mc_no'_initial_time.txt')
    echo;echo;echo "initial time: $initial_time"
    echo "final time: $final_time"
  #initial_time=0000
    time_difference_in_sec=$(( $final_time - $initial_time ))

    echo "time difference in sec: $time_difference_in_sec"

    time_difference_in_min=$(( $time_difference_in_sec / 60 ))


    if [ "$time_difference_in_sec" -le "3600" ]
    then
      email_subject="$mc_id $mc_no switched on $difference_btwn_new_old_ign_values times within $time_difference_in_min minutes"

            `echo -e "Hi there,nn$mc_id $mc_no has been switched on $difference_btwn_new_old_ign_values times within the last $time_difference_in_min minutesnnCheers," | mail -s "$email_subject" $email_list`

      echo "EMAIL SENT"

: <<'psuedo'

      > $mc_id$mc_no'_old_ignition_value.txt'
      echo $new_ignition_value >> $mc_id$mc_no'_old_ignition_value.txt'

psuedo
    fi  

    if [ "$time_difference_in_sec" -gt "3600" ]
    then

            > $mc_id$mc_no'_initial_time.txt'
            initial_time=`date +"%s"`    
            echo $initial_time >> $mc_id$mc_no'_initial_time.txt'


    fi
fi

Eliminé los detalles del correo electrónico, pero esa línea funciona bien.

Sinceramente, no sé qué más puedo hacer. La única diferencia con este archivo bash es que llama a otro archivo 'txt ejecutable' desde dentro. Y ambos archivos funcionan muy bien desde la terminal por sí mismos.

Relacionado:¿Cómo mostrar los resultados "principales" ordenados por uso de memoria en tiempo real?

Actualización (18/02/2015):
Probé más el CronTab escribiendo otra secuencia de comandos (más simple) para enviar por correo electrónico una marca de tiempo, también grabé la marca de tiempo en un archivo .txt, que funcionó sin problemas. Lo reescribí porque estaba pensando que tal vez CronTab no estaba funcionando como debería.

Para cualquiera que tenga un problema similar, estas son algunas opciones que debe considerar:
Otras cosas que hice durante la resolución de problemas (no en orden)

  • Se creó un eco en un archivo de texto para ver si el programa se estaba ejecutando
  • Evitó usar sudo crontab -e todos recomiendan mantenerse alejado de sudo crontab -e
  • Verificó la ruta del directorio dentro del crontab
  • Lea/relea varios foros, lea/relea mi programa una y otra vez (consiga que lo haga otra persona que entienda de programación, ya que los ojos frescos pueden ver lo que podría perderse)
  • Se agregaron PATH y SHELL en crontab
  • Se agregaron diferentes CronJobs (actualización mencionada el 18/02/15)
  • Cambió la ruta relativa a la ruta completa dentro de todos los programas Esto hizo que funcionara con el crontab

Respuesta aceptada:

Creo que necesitas configurar la variable de ruta en el script

Por ejemplo

PATH='/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin'

Linux
  1. ¿Por qué Nullglob no es predeterminado?

  2. ¿Por qué este "mientras se lee" funciona en una terminal, pero no en un script de Shell?

  3. Cron Script no se ejecuta como se esperaba de crontab – Solución de problemas

  4. gnome-terminal:comando no encontrado

  5. eco:comando no encontrado

Ejecute el script con rc.local:el script funciona, pero no al arrancar

Cualquier forma de salir del script bash, pero sin salir de la terminal

Postgres no permite localhost pero funciona con 127.0.0.1

Pycharm tensorflow ImportError pero funciona bien con Terminal

¿Cómo iniciar programas GUI Linux desde la línea de comandos, pero separados de la línea de comandos?

¿Cómo puedo excluir un paquete de yum-cron pero no de la actualización manual de yum?