GNU/Linux >> Tutoriels Linux >  >> Linux

Bashscript fonctionne depuis Terminal mais pas depuis Crontab ?

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'

Linux
  1. La commande Shuf File> File laisse-t-elle un fichier vide, mais pas les commandes similaires ? ?

  2. Le script Cron ne s'exécute pas comme prévu à partir de crontab - Dépannage

  3. Exécutez le script avec rc.local :le script fonctionne, mais pas au démarrage

  4. N'importe quel moyen de quitter le script bash, mais sans quitter le terminal

  5. Pycharm tensorflow ImportError mais fonctionne bien avec Terminal

Autoriser les scripts à lire un fichier mais empêcher les utilisateurs de visualiser le fichier directement

envoyer du courrier depuis le terminal linux en une seule ligne

Postgres n'autorise pas localhost mais fonctionne avec 127.0.0.1

Modules Python introuvables sur le terminal mais sur le shell Python, Linux

Comment démarrer des programmes Linux GUI à partir de la ligne de commande, mais séparément de la ligne de commande ?

Impossible d'accéder au port 80 depuis un emplacement distant mais fonctionne en local ?