GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Bashscript funktioniert vom Terminal, aber nicht von Crontab?

Ich habe ein paar CronJobs und sie funktionieren gut, bis auf einen. Ich habe viele Foren und Websites durchgesehen und eine Kombination von Dingen ausprobiert, aber leider hat nichts funktioniert.

Umformulieren der Frage ist:

F: Das Bashscript funktioniert vom Terminal aus problemlos. Aber mit dem CronJob geht es gar nicht.

Das letzte, was ich zum Debuggen getan habe, ist Folgendes:

1) Geprüft, ob der Cron-Daemon läuft (ps ax | grep ) =funktioniert

2) Einen zusätzlichen Chron-Job gemacht, um mir jede Minute (erneut zu testen) eine E-Mail zu senden (* * * * * echo "hello" | mail -s "subject" [email protected]). ) =hat gut funktioniert

3) Ich habe mein Bash-Skript eigenständig über das Terminal laufen lassen =hat gut funktioniert

4) Ich habe grep CRON /var/log/syslog überprüft bei Fehlern =sieht gut aus/keine Fehler

5) Auf Berechtigungen etc. geprüft =keine Probleme mit Berechtigungen

6) Der Dateipfad zum Bash-Skript für den Cron-Job sieht gut aus

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

und die 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

Ich habe die Details bezüglich der E-Mail ausgeschnitten, aber diese Zeile funktioniert einwandfrei.

Ich weiß ehrlich gesagt nicht, was ich noch tun kann. Der einzige Unterschied zu dieser Bash-Datei besteht darin, dass sie eine andere „ausführbare txt“-Datei aus ihr heraus aufruft. Und beide Dateien funktionieren vom Terminal aus hervorragend.

Verwandt:Wie zeigt man „Top“-Ergebnisse sortiert nach Speichernutzung in Echtzeit an?

Aktualisierung (18.02.2015):
Ich habe CronTab weiter ausprobiert, indem ich ein anderes (einfacheres) Skript geschrieben habe, um einen Zeitstempel per E-Mail zu versenden, und den Zeitstempel auch in einer .txt-Datei aufgezeichnet hat – was ohne Probleme funktioniert hat. Ich habe es umgeschrieben, weil ich dachte, dass CronTab vielleicht nicht so funktioniert, wie es sollte.

Für alle, die ein ähnliches Problem haben, sind dies einige Optionen, die Sie in Betracht ziehen sollten:
Andere Dinge, die ich während der Fehlerbehebung getan habe (nicht in der Reihenfolge)

  • Erzeugte ein Echo in eine Textdatei, um zu sehen, ob das Programm ausgeführt wurde
  • Die Verwendung von sudo crontab -e wurde vermieden jeder empfiehlt, sich von sudo crontab -e fernzuhalten
  • Prüfte den Verzeichnispfad in der Crontab
  • Lesen/lesen Sie verschiedene Foren, lesen/lesen Sie mein Programm immer und immer wieder (lassen Sie es jemand anderen machen, der sich mit Programmierung auskennt, da frische Augen sehen können, was Sie vielleicht übersehen)
  • PATH und SHELL in crontab hinzugefügt
  • Verschiedene CronJobs hinzugefügt (erwähntes Update 18.02.15)
  • Änderte den relativen Pfad in allen Programmen zum vollständigen Pfad Dadurch funktionierte es mit der Crontab

Akzeptierte Antwort:

Ich denke, Sie müssen die Pfadvariable im Skript setzen

Zum Beispiel

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

Linux
  1. Warum ist Nullglob kein Standard?

  2. Bild herunterladen Funktioniert in Firefox, aber nicht in Internet Explorer

  3. So verhindern Sie, dass Nicht-Root-Benutzer einen Crontab-Eintrag erstellen

  4. E-Mail vom Linux-Terminal in einer Zeile senden

  5. Postgres lässt localhost nicht zu, funktioniert aber mit 127.0.0.1

Skript mit rc.local ausführen:Skript funktioniert, aber nicht beim Booten

Jede Möglichkeit, das Bash-Skript zu beenden, aber das Terminal nicht zu verlassen

Pycharm tensorflow ImportError funktioniert aber gut mit Terminal

Lassen Sie den Linux-Server rsync/scp/sftp zulassen, aber keine Terminalanmeldung

Wie kann ich ein Paket von yum-cron ausschließen, aber nicht vom manuellen yum-Upgrade?

Kann nicht auf Port 80 von einem entfernten Standort aus zugreifen, funktioniert aber lokal?