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'