J'ai un tas de CronJobs, et ils fonctionnent bien, sauf un. J'ai parcouru de nombreux forums et sites Web, et j'ai essayé une combinaison de choses, mais hélas, rien n'a fonctionné.
La reformulation de la question est :
Q : Le bashscript fonctionne sans aucun problème depuis le terminal. Mais avec le CronJob ça ne marche pas du tout.
La dernière chose que j'ai faite pour le débogage est la suivante :
1) Vérifié si le démon Cron est en cours d'exécution (ps ax | grep
) =fonctionne
2) J'ai fait un travail chron supplémentaire pour (retester) m'envoyer un e-mail toutes les minutes (* * * * * echo "hello" | mail -s "subject" [email protected]
) =a bien fonctionné
3) J'ai exécuté mon script bash via le terminal en mode autonome =a bien fonctionné
4) J'ai vérifié grep CRON /var/log/syslog
pour toutes les erreurs =semble bon/pas d'erreurs
5) Vérifié les autorisations, etc. =aucun problème avec les autorisations
6) Le chemin du fichier vers le script bash pour la tâche cron semble correct
#!/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
et le 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
J'ai coupé les détails concernant l'e-mail, mais cette ligne fonctionne bien.
Honnêtement, je ne sais pas ce que je peux faire d'autre. La seule différence avec ce fichier bash est qu'il appelle un autre fichier "txt exécutable" à partir de celui-ci. Et ces deux fichiers fonctionnent très bien à partir du terminal par eux-mêmes.
En relation :Comment afficher les résultats "top" triés par utilisation de la mémoire en temps réel ?
Mise à jour (18/02/2015) :
J'ai encore essayé le CronTab en écrivant un autre script (plus simple) pour envoyer un horodatage par e-mail, également enregistré l'horodatage dans un fichier .txt - qui a fonctionné sans aucun problème. Je l'ai réécrit parce que je pensais que la CronTab ne fonctionnait peut-être pas comme elle le devrait.
Pour toute personne ayant un problème similaire, voici quelques options que vous devriez envisager :
Autres choses que j'ai faites pendant le dépannage (pas dans l'ordre)
- Création d'un écho vers un fichier texte pour voir si le programme était en cours d'exécution
- Éviter d'utiliser sudo crontab -e tout le monde recommande de rester à l'écart de sudo crontab -e
- Vérifié le chemin du répertoire dans la crontab
- Lisez/relisez divers forums, lisez/relisez mon programme encore et encore (demandez à quelqu'un d'autre qui comprend la programmation de le faire, car un regard neuf peut voir ce que vous pourriez manquer)
- Ajout de PATH et SHELL dans crontab
- Ajout de différents CronJobs (mentionné la mise à jour du 18/02/15)
- Changement du chemin relatif vers le chemin complet dans tous les programmes Cela l'a fait fonctionner avec le crontab
Réponse acceptée :
Je pense que vous devez définir la variable de chemin dans le script
Par exemple
PATH='/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin'