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'