ich arbeite mit sun Solaris 10
einem Legacy-System. Ich habe ein Skript erstellt, das bestimmte Produzenten verarbeitet. Es besteht aus bash/perl/posix/sqlplus/awk
etwa 1.000 Zeilen und funktioniert im Standalone-Modus einwandfrei. Es würde wie erwartet funktionieren, aber es gab ein Problem, bei dem das Skript in Crontab nicht funktionierte. Ich bin vielen Vorschlägen von StackOverflow/stackunixexchange gefolgt, wie:
- beginnen mit Shebang
#!/bin/bash
- Skript mit voller Berechtigung 777
- richtige Crontab-Zeitsyntax
- Dienst neu gestartet
- alle Umgebungsvariablen im oberen Teil der Shell geladen
- setze bash an den Anfang des Skripts in crontab bash
mein Problem betrifft nur dieses Skript und der Rest der Skripte funktioniert einwandfrei, vielleicht weil das Skript in Bash sein muss und Crontab standardmäßig mit sh oder Crontab ausgeführt wird, laden Sie die minimale Umgebungsvariable
Schließlich habe ich das Problem gelöst, indem ich die benötigte Shell in eine andere Shell eingefügt und sie über die neue Shell ausgeführt habe, indem ich die neue Shell in crontab festgelegt habe. Nach diesem Schritt kann ich sehen, dass crontab einwandfrei funktioniert und das Skript ausführen kann, aber das Problem ist, dass das Skript nicht die erwartete Aufgabe erledigt, es überspringt bash statements
ähnliche if statements
Aufgaben und andere Aufgaben wie sqlplus
Producer. Perl statements
Können Sie mir bitte sagen, wie ich dieses Problem lösen kann? Dieses Problem trat nur beim Planen des Skripts in crontab auf.
Shell in Crontab sieht so aus:
10 10,16 * * 1,4 bash /rate/u01/WORK/MP/ERROR/USAGE_REJECTIONS/HolderUsageShell.sh
Das Skript beginnt wie folgt:
#!/bin/bash
#environment shell contains all environment variables, I have tried to run it with/without and I got the same thing
/rate/environment.sh >/dev/null
cd /rate/path/
CurrentHour=$(date +%I)
DAY_In_Word=$(date +%A)
if [[ "$DAY_In_Word" == "Monday" || "$DAY_In_Word" == "Thursday" ]] && [[ "$CurrentHour" == "10" ]]; then
.
.
.
Antwort1
Sie können Ihre Umgebung nicht in einer Untershell ändern: Wenn die Untershell endet, gehen die Änderungen verloren. Die Untershell kann die Umgebung des übergeordneten Elements nicht ändern. Sie müssen die Umgebung in der aktuellen Shell ändern. Nehmen Sie diese Änderung an Ihrem Skript vor:
/rate/environment.sh >/dev/null
sollte sein
. /rate/environment.sh >/dev/null