Bash-Skript funktioniert nicht wie erwartet über Crontab

Bash-Skript funktioniert nicht wie erwartet über Crontab

ich arbeite mit sun Solaris 10einem Legacy-System. Ich habe ein Skript erstellt, das bestimmte Produzenten verarbeitet. Es besteht aus bash/perl/posix/sqlplus/awketwa 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:

  1. beginnen mit Shebang#!/bin/bash
  2. Skript mit voller Berechtigung 777
  3. richtige Crontab-Zeitsyntax
  4. Dienst neu gestartet
  5. alle Umgebungsvariablen im oberen Teil der Shell geladen
  6. 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 sqlplusProducer. Perl statementsKö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

verwandte Informationen