Das Problem
Ausführen eines Skripts mit dem cron-Dienst, das normalerweise von der Shell aus ausgeführt wird, aber nicht das gleiche Verhalten zeigt, wenn es von crontab ausgeführt wird.
Ursache
Eine der häufigsten Ursachen dafür, dass der Crontab-Job nicht korrekt ausgeführt wird, ist, dass ein Cronjob nicht unter der Shell-Umgebung des Benutzers ausgeführt wird. Ein weiterer Grund kann sein – nicht den absoluten Pfad der im Skript verwendeten Befehle anzugeben. Wenn das Skript manuell ausgeführt wird, kann die Umgebungsvariable wie PATH anders sein als bei der Ausführung über Cron. Es wird daher immer empfohlen, die absoluten Pfade der verwendeten Befehle in das Skript aufzunehmen.
Aus diesem Grund sind alle Umgebungsvariablen für den Benutzer, die in einer normalen Shell vorhanden sind, während der Cron-Job-Ausführung nicht verfügbar, es sei denn, sie werden explizit vom Skript importiert.
Wenn zum Beispiel die Shell eine ORACLE_HOME-Variable definiert hat und sie in die PATH-Umgebungsvariable einfügt und das Skript diese Variablen verwendet, wird das Skript in sell ausgeführt, aber wenn es von crontab ausgeführt wird, hat das Skript keine Kenntnis von diesen Variablen standardmäßig.
Die Lösung
Definieren oder importieren Sie ORACLE_HOME und die vollständige PATH-Variable in der Cron-Skriptdatei, wie Sie in der Oracle-Benutzer-Shell sehen (oracle_user_shell> echo $PATH).
Eine gute Praxis ist es, die Benutzerumgebung immer am Anfang des Skripts script.sh mit dem Befehl:
zu importieren#!/bin/bash . /home/oracle/.bashrc [rest of script]
Dadurch wird /home/oracle/.bashrc gelesen und die Umgebung darin importiert. Je nach Umgebung des Benutzers kann es auch /home/oracle/.bash_profile oder andere Dateien sein.
HINWEIS :Zwischen dem Punkt „.“ befindet sich ein Leerzeichen. und „/home..“
[* * * * *] /home/oracle/script.sh 2> /tmp/crontab_script_log.txt 2>&1
Hinweis :Ersetzen Sie [* * * * *] durch die korrekten Ausführungszeiten für Ihren Fall.
Sie können dann /tmp/crontab_script_log.txt auf die Ausgabe der Ausführung überprüfen. Wenn irgendwelche Variablen undefiniert sind oder wenn das Skript andere Fehler hat, wird die Ausgabe es einfacher machen, die Ursache des Problems zu finden.