Konfiguration von Schedulern

Es gibt 2 Arten von Schedulern:

  • Scheduler für Perl-Skripte

  • Scheduler für UNIX Shell-Skripte

Scheduler für Perl-Skripte

Scheduler für Perl-Skripte werden pro Cartridge in Cartridge/Data/Scheduler/Scheduler.conf (Ini-File-Format) konfiguriert. Das Ini-File ist case-sensitiv.

Beispiel (DE_EPAGES/CrossSelling/Data/Scheduler/Scheduler.conf):

[AutomateAutoCrossSelling]
# run? (1 - yes, else - no)
IsActive=1
# what? (use slashes here, not backslashes)
Command=$ENV{EPAGES_CARTRIDGES}/DE_EPAGES/CrossSelling/Scripts/automateAutoCrossSelling.pl
# where? (separated by ','; unset -> any)
Machine=
# when? (job wont't run if Cron= (UNIX) or Schtasks= and At= (Win) is/are unset)
# when? (Unix: minute/hour/day of month/month/day of week) [see 'man crontab']
Cron=35 1 * * *
# when? (Windows: schtasks arguments) [see online help of schtasks]
Schtasks=/st 01:35 /sc DAILY
# when? (Windows: at args) [if schtasks runs, ignore at; see online help of at]
At=01:35 /every M,T,W,Th,F,S,Su
# what command options?
Options=-nooutput
# what command loop?
Loop=Store

Der Name des Scheduler-Jobs entspricht dem Section-Namen. Jede Section enthält die Keys IsActive, Command, Machine, Cron, Schtasks, At, Options und Loop.

IsActive

Wenn nicht 1, steht der Job nicht im Scheduler.

Command

Auszuführendes Perl-Skript.

Machine

Wenn der lokale Rechner nicht in der Liste auftaucht, steht der Job nicht im Scheduler. Ist Machine nicht gesetzt, steht der Job im Scheduler.

Cron

Ausführungszeit im UNIX crontab-Format, wenn nicht gesetzt, wird der Job nicht unter UNIX ausgeführt.

Schtasks

Ausführungszeit im Windows schtasks-Format.

At

Ausführungszeit im Windows at-Format. Ist weder Schtasks noch At gesetzt, wird der Job nicht unter Windows ausgeführt. Kennt der Windows-Rechner das Kommando schtasks, wird At ignoriert.

Options

Optionen für das Perl-Skript wie in Command definiert.

Loop

Loops werden benutzt, um ein Perl-Skript mehrfach mit den verschiedenen Loop-Optionen (zusätlich zu den Standardoptionen) aufzurufen.

Der Value des Keys Loop muß ein Key der Section LOOPS sein. Diese Section steht nicht im Cartridge-Scheduler.conf, sondern im globalen Konfigurationsfile in $EPAGES_CONFIG/Scheduler.conf. Muß eine neue Loop definiert werden, so muß das globale Scheduler.conf geändert werden.

Loops werden benutzt, um ein Perl-Skript mehrfach mit den verschiedenen Loop-Optionen (zusätlich zu den Standardoptionen) aufzurufen.

Beispiel ($EPAGES_CONFIG/Scheduler.conf):

[LOOPS]
# command loops (separated by ',')
Store=-storename Store
StoreEnvironment=-storename Store -environment DE
Backup=-storename Backup
BackupDB=-storename Backup -dbname storedb,-storename Backup -dbname sitedb
PreCreateShop=-storename Store -shoptype ECommerceFlex -count 20 -provider Distributor $ENV{EPAGES_STORES}/Site/ShopImport/ECommerceFlex.xml
...

Das globale Konfigurationsfile ist in AllOS/Shared/Config/Scheduler.conf eingecheckt.

Scheduler für UNIX Shell-Skripte

Scheduler für UNIX Shell-Skripte werden global im Verzeichnis $EPAGES_CONFIG/Scheduler.d/ konfiguriert. Für jeden Job gibt es ein File, die Files im Verzeichnis sind (wie immer bei UNIX) case-sensitiv.

$EPAGES_CONFIG/Scheduler.d/ enthält folgende Files:

appserver-*.env

Jobs, die (in der Crontab) von ep_appl abgearbeitet werden

dbserver-*.env

Jobs, die (in der Crontab) von ep_db abgearbeitet werden

webserver-*.env

Jobs, die (in der Crontab) von web_appl abgearbeitet werden

Andrere Filenamen sind nicht erlaubt.

Beispiel (dbserver-RotateLogs.env, von ep_db ausgeführt):

#!/bin/bash
# run? (1 - yes, else - no)
ISACTIVE=1
# what?
COMMAND="$EPAGES_CARTRIDGES/DE_EPAGES/Core/bin/logfilemgmt.sh"
# where? (separated by ','; unset -> any)
MACHINE=
# when? (minute/hour/day of month/month/day of week) [see 'man crontab']
CRON="7 * * * *"
# notify who? (unset -> $LOGNAME@localhost)
RECIPIENT=
# search directory/ies for log files (separated by ' ')
SEARCHDIRS="$SYBASE_ASE_LOG"
# -s SIZE[ckm]: required size (in bytes, KB, MB) to compress
SIZE="-s 10m"
# -d DAYS: remove compressed files older than DAYS (unset -> don't remove)
DAYS=
# -a DIR: move compressed files into ARCHIVE directory
ARCHIVE="-a $SYBASE_ASE_LOG/Archive"
# -z ZIPPER: use compression instead of 'gz' (allowed: gz,bz2,lzo,zip,Z)
ZIPPER=
# what command options?
OPTIONS="$SIZE $DAYS $ARCHIVE $ZIPPER $SEARCHDIRS"
# what command loop? (separated by ',')
LOOP=

Die Variablen ISACTIVE, COMMAND, MACHINE, CRON, RECIPIENT, OPTIONS und LOOP werden vom Scheduler ausgewertet, alle anderen Variablen sind Hilfsvariablen. Die Bedeutung der Variablen entspricht den Scheduler-Variablen der Perl-Skripte.

Die Variable CRON muß gequotet werden.

Die Variable LOOP enthält alle tatsächlichen Loops, es gibt im Ggs. zu dem Perl-Script-Scheduler keine gemeinsame Loop-Verwaltung. Tatsächlich haben wir kein Shell-Script, das eine Loop benötigt.

Die .env-Files sind in AllOS/Shared/Config/Scheduler.d eingecheckt.

Installation von Perl-Skript-Schedulern

Scheduler für Perl-Skripte werden bei der Cartridge-Installation installiert, suche nach scheduler im Core/API/FileInstaller.pm.

Bei der Cartridge-Installation werden das Cartridge-Scheduler.conf und das globale $EPAGES_CONFIG/Scheduler.conf gelesen. Die Sections aus Cartridge-Scheduler.conf werden nach $EPAGES_CONFIG/Scheduler.conf übernommen, wenn die Section nicht schon in $EPAGES_CONFIG/Scheduler.conf enthalten ist.

Es gibt keine epages5-Applikations-Funktion, die die Sections wieder aus $EPAGES_CONFIG/Scheduler.conf entfernt.

Ausführen von Scheduler-Jobs

Das Skript $EPAGES_CARTRIDGES/DE_EPAGES/Core/bin/epagesScheduler.sh kennt folgende Argumente:

start

startet alle Scheduler-Jobs aus $EPAGES_CONFIG/Scheduler.conf und (bei UNIX) aus $EPAGES_CONFIG/Scheduler.d/*.env, d.h. die Jobs werden in die Scheduler-Tabellen (crontab, at/schtasks-Tabelle) eingetragen

stop

stoppt alle Scheduler-Jobs aus $EPAGES_CONFIG/Scheduler.conf und (bei UNIX) aus $EPAGES_CONFIG/Scheduler.d/*.env, d.h. die Jobs werden aus den Scheduler-Tabellen (crontab, at/schtasks-Tabelle) ausgetragen

show

zeigt alle laufenden Scheduler-Jobs aus $EPAGES_CONFIG/Scheduler.conf und (bei UNIX) aus $EPAGES_CONFIG/Scheduler.d/*.env

Bei UNIX werden die Jobs in folgende crontabs eingetragen:

  • Perl-Skript-Jobs in die ep_appl-crontab

  • Shell-Jobs, die mit appserver- beginnen, in die ep_appl-crontab

  • Shell-Jobs, die mit dbserver- beginnen, in die ep_db-crontab

  • Shell-Jobs, die mit webserver- beginnen, in die ep_web-crontab

Shell-Jobs stehen in $EPAGES_CONFIG/Scheduler.d/.

Bei Unix wird der Scheduler durch /etc/init.d/epages5 start reloaded:

a) /etc/init.d/epages5 start_httpd: startet die Jobs für ep_web

b) /etc/init.d/epages5 start_service startet die Jobs für ep_appl

c) /etc/init.d/epages5 start_db startet die Jobs für ep_db

Die auszuführenden Jobs laufen innerhalb eines Job-Wrappers.

Beispiel (UNIX-crontab):

35 1 * * * /srv/epages/eproot/Cartridges/DE_EPAGES/Core/bin/wrapScheduler.sh AutomateAutoCrossSelling

Bei Windows wir entsprechend wrapScheduler.cmd aufgerufen. Der Job-Wrapper führt folgende Befehle aus:

  1. Gibt es ein File $EPAGES_CONFIG/Scheduler.d/JOB.env (hier z.b. AutomateAutoCrossSelling.env), dann wird der Job als Shell-Skript behandelt.

1a. Wenn der Job nicht nicht {app,db,web}server- beginnt, wird er nicht ausgeführt.

1b. Die Environment wie in $EPAGES_CONFIG/Scheduler.d/*.env definiert wird geladen und COMMAND mit OPTIONS ausgeführt.

  1. Gibt es eine Section JOB in $EPAGES_CONFIG/Scheduler.conf, wird der Job aus Perl-Skript behandelt, das mit den in der Section definierten Optionen ausgeführt wird.

Der Job wird nur dann ausgeführt, wenn der vorhergehende Job beendet ist. Läuft der Job noch (und es gibt das File JOB.pid (z.b. $EPAGES_LOG/Scheduler/cyansun.AutomateAutoCrossSelling.pid)), wird eine Fehler-Mail versandt.

Scheduler-Job-Output

Bei Perl-Skript-Jobs werden alle Fehler-Mails an die im TBO angegebene Error-Mail-Address gesendet. Bei Shell-Skript-Jobs werden die Fehler-Mails an die im .env-File gesetzte Variable RECIPIENT gesendet.

Die Jobs haben verschiedene Output-Files MACHINE.JOB.EXT, die abhängig vom User in folgenden Verzeichnissen gespeichert were:

ep_appl

$EPAGES_LOG/Scheduler

ep_db

$SYBASE/ASE-12_5/init/logs

ep_web

$HTTPD_ROOT/logs

Es gibt folgende Job-Output-Files, durch den Wrapper wrapScheduler.{sh,cmd} geschrieben:

MACHINE.JOB.pid (temporär)

zeigt an, daß der vorhergehende JOB noch nicht beendet ist, enthält bei UNIX die Process ID

MACHINE.JOB.log (permanent)

enthält (Fehler-)Output aller bisherigen JOB-Aufrufe

MACHINE.JOB.run (temporär)

enthält den (Fehler-)Output des Jobs; ist dieses File nicht leer, wird eine Fehler-Mail geschrieben und das MACHINE.JOB.log erweitert

MACHINE.JOB.head (temporär)

enthält einen Header, der, wenn .run nicht leer ist, zusammen mit .run versendet / an .log angehängt wird

MACHINE.JOB.mail (temporär)

mail, die versendet wird, enthält .head und MACHINE.JOB.run

MACHINE.JOB.head sieht typischerweise so aus:

  • Output from program $RUN_SCRIPT * COMMAND: $COMMAND $OPTIONS > $LOG_FILE.run 2>&1 LOOP: $LOOP DATE: $DATE HOSTNAME: $HOST USERNAME: $LOGNAME