GNU/Linux >> Linux Esercitazione >  >> Linux

Bashscript funziona da Terminal ma non da Crontab?

Ho un sacco di CronJob e funzionano bene, tranne uno. Ho esaminato molti forum e siti Web e ho provato una combinazione di cose, ma purtroppo niente ha funzionato.

Riformulare la domanda è:

D: Il bashscript funziona senza problemi dal terminale. Ma con CronJob non funziona affatto.

L'ultima cosa che ho fatto per il debug è la seguente:

1) Verificato se il demone Cron è in esecuzione (ps ax | grep ) =funziona

2) Fatto un lavoro chron extra per (ritestare) inviarmi un'e-mail ogni minuto (* * * * * echo "hello" | mail -s "subject" [email protected] ) =ha funzionato bene

3) Ho eseguito il mio script bash attraverso il terminale come standalone =ha funzionato bene

4) Ho controllato grep CRON /var/log/syslog per eventuali errori =sembra buono/nessun errore

5) Verificate le autorizzazioni ecc. =nessun problema con le autorizzazioni

6) Il percorso del file allo script bash per il lavoro cron sembra corretto

#!/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

e 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

Ho eliminato i dettagli relativi all'e-mail, ma quella riga funziona bene.

Sinceramente non so cos'altro posso fare. L'unica differenza con questo file bash è che chiama un altro file "txt eseguibile" al suo interno. Ed entrambi questi file funzionano alla grande dal terminale da soli.

Correlati:come visualizzare i risultati "principali" ordinati in base all'utilizzo della memoria in tempo reale?

Aggiornamento (18/02/2015):
Ho ulteriormente provato CronTab scrivendo un altro script (più semplice) per inviare tramite e-mail un timestamp, inoltre ho registrato il timestamp in un file .txt, che ha funzionato senza problemi. L'ho riscritto perché stavo pensando che forse CronTab non funzionava come dovrebbe.

Per chiunque abbia un problema simile, queste sono alcune opzioni che dovresti considerare:
Altre cose che ho fatto durante la risoluzione dei problemi (non in ordine)

  • Creato un'eco in un file di testo per vedere se il programma era in esecuzione
  • Evitato di usare sudo crontab -e tutti consigliano di stare lontano da sudo crontab -e
  • Controllato il percorso della directory all'interno del crontab
  • Leggi/rileggi vari forum, leggi/rileggi il mio programma più e più volte (fai fare a qualcun altro che capisca la programmazione, poiché occhi nuovi possono vedere cosa potresti perderti)
  • Aggiunti PATH e SHELL in crontab
  • Aggiunti diversi CronJob (menzionato aggiornamento 18/02/15)
  • Cambiato il percorso relativo al percorso completo all'interno di tutti i programmi Questo lo ha fatto funzionare con crontab

Risposta accettata:

Penso che tu debba impostare la variabile del percorso nello script

Ad esempio

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

Linux
  1. Il comando Shuf File> File lascia un file vuoto, ma comandi simili no??

  2. Perché questo "durante la lettura" funziona in un terminale, ma non in uno script di shell?

  3. Scarica un'immagine Funziona in FireFox ma non in Internet Explorer

  4. Cron Script non viene eseguito come previsto da crontab – Risoluzione dei problemi

  5. gnome-terminal:comando non trovato

echo:comando non trovato

inviare posta dal terminale Linux in una riga

Postgres non consente localhost ma funziona con 127.0.0.1

Moduli Python non trovati sul terminale ma su Python Shell, Linux

Come avviare i programmi Linux GUI dalla riga di comando, ma separati dalla riga di comando?

fai in modo che il server linux consenta rsync/scp/sftp ma non un accesso al terminale