Moodle/Cron: Unterschied zwischen den Versionen

Aus Foxwiki
K Textersetzung - „lynx“ durch „linux“
 
Zeile 19: Zeile 19:
In diesem Beispiel wird das Ergebnis abgelegt (nach /dev/null).
In diesem Beispiel wird das Ergebnis abgelegt (nach /dev/null).


Das gleiche mit lynx:
Das gleiche mit linux:


  lynx -dump http://example.com/moodle/admin/cron.php > /dev/null
  linux -dump http://example.com/moodle/admin/cron.php > /dev/null


Alternativ können Sie eine separate PHP-Version nutzen, die über die Kommandozeile gesteuert wird. Der Vorteil dieser Variante ist, dass in den Log-Dateien des Web-Servers der Aufruf von cron.php nicht ständig protokolliert wird. Der Nachteil dieser Variante besteht darin, dass Sie einen Zugang zur Kommando-Zeile der PHP-Version benötigen.
Alternativ können Sie eine separate PHP-Version nutzen, die über die Kommandozeile gesteuert wird. Der Vorteil dieser Variante ist, dass in den Log-Dateien des Web-Servers der Aufruf von cron.php nicht ständig protokolliert wird. Der Nachteil dieser Variante besteht darin, dass Sie einen Zugang zur Kommando-Zeile der PHP-Version benötigen.
Zeile 51: Zeile 51:
In diesem Beispiel wird das Ergebnis nicht aufgewahrt (to /dev/null).
In diesem Beispiel wird das Ergebnis nicht aufgewahrt (to /dev/null).


Das gleiche unter lynx:
Das gleiche unter linux:


  lynx -dump http://example.com/moodle/admin/cron.php > /dev/null
  linux -dump http://example.com/moodle/admin/cron.php > /dev/null


Alternativ können sie eine standalone version von PHP nutzen, die kompiliert in der Kommandozeile läuft. The advantage with doing this is that your web server logs aren't filled with constant requests to cron.php. The disadvantage is that you need to have access to a command-line version of php.
Alternativ können sie eine standalone version von PHP nutzen, die kompiliert in der Kommandozeile läuft. The advantage with doing this is that your web server logs aren't filled with constant requests to cron.php. The disadvantage is that you need to have access to a command-line version of php.

Aktuelle Version vom 22. Januar 2024, 15:17 Uhr

Cron-Job einrichten

Einige Module von Moodle prüfen regelmäßig, ob bestimmte Aufgaben ausgeführt werden müssen. Moodle überprüft z.B. ob es im Forum neue Einträge gibt, die per Email an Nutzer versandt werden müssen.

Das Skript, das all diese Vorgänge steuert, finden Sie im Admin-Verzeichnis und heißt cron.php. Diese Datei läuft nicht von alleine. Sie müssen einen Mechanismus einrichten, der die Datei z.B. alle fünf Minuten ausführt. Dazu ist es erforderlich, dass ein "Impuls" für jedes Modul ausgelöst wird.

Der Auslöser dieses Impulses muss nicht von dem Server erfolgen auf dem Moodle installiert ist.. Wenn Sie auf diesem Server keine Cron-Jobs ausführen können, kann dies von einem anderen Server ausgelöst oder von Ihrem PC gestartet werden. Es ist lediglich nötig, die Datei cron.php alle fünf Minuten aufzurufen.

Testen Sie zuerst, ob die Datei funktioniert. Rufen Sie sie mit Ihrem Browser auf:

http://example.com/moodle/admin/cron.php

Nehmen Sie nun einige Einstellungen vor:

Aufruf des Skripts von der Kommandozeile

Rufen Sie die Datei wie zuvor auf. Nehmen Sie dazu z.B. den Unix-Befehl 'wget':

wget -q -O /dev/null http://example.com/moodle/admin/cron.php

In diesem Beispiel wird das Ergebnis abgelegt (nach /dev/null).

Das gleiche mit linux:

linux -dump http://example.com/moodle/admin/cron.php > /dev/null

Alternativ können Sie eine separate PHP-Version nutzen, die über die Kommandozeile gesteuert wird. Der Vorteil dieser Variante ist, dass in den Log-Dateien des Web-Servers der Aufruf von cron.php nicht ständig protokolliert wird. Der Nachteil dieser Variante besteht darin, dass Sie einen Zugang zur Kommando-Zeile der PHP-Version benötigen.

/opt/bin/php /web/moodle/admin/cron.php

(Windows) C:\apache\php\php.exe C:\apache\htdocs\moodle\admin\cron.php

Automatische Ausführung des Skripts alle 5 Minuten

Bei UNIX- Systemen: Use cron. Passen Sie ihre Einstellungen für Cron- Jobs über die Komandozeile mit folgendem Befehl an "crontab -e" und fügen Sie folgende Zeile hinzu:

*/5 * * * * wget -q -O /dev/null http://example.com/moodle/admin/cron.php

Bei Windows-Systemen: Der einfachste Weg ist hier mein Programm zu benutzen, moodle-cron-for-windows.zip wodurch die Anpassungen ganz einfach sind. Sie können alternativ dazu, die in Windows enthaltene Funktion "Scheduled Tasks" benutzen.

Bei Web Hosting Services

Die Oberflächedes Web Host Services bietet Ihnen die Möglichkeit, einen Cron Job einzurichten. Z.B. Cpanel Systeme: Hier gibt es einen Button "Cron jobs". Geben Sie hier die folgenden Unix-Befehle ein.

Kommando-Zeile von Unix nutzen

Es gibt verschiedene Kommandozeilenprogramme, die Sie aufrufen können. Auf Ihrem Server sind vielleicht nicht alle verfügbar.

Z.B. das Unix-Utility 'wget':

wget -q -O /dev/null http://example.com/moodle/admin/cron.php

In diesem Beispiel wird das Ergebnis nicht aufgewahrt (to /dev/null).

Das gleiche unter linux:

linux -dump http://example.com/moodle/admin/cron.php > /dev/null

Alternativ können sie eine standalone version von PHP nutzen, die kompiliert in der Kommandozeile läuft. The advantage with doing this is that your web server logs aren't filled with constant requests to cron.php. The disadvantage is that you need to have access to a command-line version of php.

/opt/bin/php /web/moodle/admin/cron.php   

Verwendung des crontab Programms auf Unix

All that Cpanel does is provide a web interface to a Unix utility known as crontab. If you have a command line, you can set up crontab yourself using the command:

crontab -e

and then adding one of the above commands like:

*/5 * * * * wget -q -O /dev/null http://example.com/moodle/admin/cron.php

Usually, the "crontab" command will put you into the 'vi' editor. You enter "insert mode" by pressing "i", then type in the line as above, then exit insert mode by pressing ESC. You save and exit by typing ":wq", or quit without saving using ":q!" (without the quotes).

Beschreibung

Der Moodle-"cron"-Prozess ist ein PHP-Skript (Teil der Moodle-Standardinstallation), das regelmäßig im Hintergrund ausgeführt werden muss. Das Moodle-Cron-Skript führt verschiedene Aufgaben in unterschiedlichen Zeitabständen aus.

WICHTIG: Überspringen Sie nicht die Einrichtung des cron-Prozesses auf Ihrem Server für Ihr Moodle. Ohne ihn wird Ihre Website nicht richtig funktionieren.

Es wird empfohlen, den Cron jede Minute laufen zu lassen, wie es für das asynchrone Löschen von Aktivitäten bei Verwendung des Papierkorbs erforderlich ist.

Das cron-Programm (das das Moodle-Skript ausführt) ist ein zentraler Bestandteil von Unix-basierten Systemen (einschließlich Linux und OSX) und wird für die Ausführung aller Arten von zeitabhängigen Diensten verwendet. Unter Windows besteht die einfachste Lösung darin, eine Aufgabe im Windows-Taskplaner zu erstellen und sie in regelmäßigen Abständen auszuführen. Bei Shared Hosting sollten Sie in der Dokumentation nachsehen (oder den Support fragen), wie cron konfiguriert ist. Die meisten Shared-Hosting-Systeme verwenden CPanel zur Verwaltung von Websites und verfügen in der Regel über einen Abschnitt für Cron-Jobs im Panel.

Im Wesentlichen besteht die Aufgabe darin, einen einzelnen Befehl zur Liste der Cron-Aktivitäten auf Ihrem System hinzuzufügen. Auf Unix-Systemen ist diese Liste eine Datei namens 'crontab', die alle Benutzer haben.

Allgemeine Diskussion

Siehe die späteren Abschnitte für Ihren Servertyp; dieser Abschnitt enthält einige allgemeine Hintergrundinformationen.

Bei der Implementierung von cron gibt es im Wesentlichen zwei Schritte:

  1. Identifizierung des richtigen Befehls zur Ausführung
  2. den richtigen Ort auf Ihrem System finden, um den Befehl auszuführen

Ausarbeitung des Moodle cron Befehls

Moodle bietet zwei verschiedene Möglichkeiten, cron einzusetzen, die unterschiedliche Skripte innerhalb der Moodle-Installation verwenden. Diese sind wie folgt...

  1. Das CLI-Skript (Kommandozeileninterpreter). Dieses befindet sich im Pfad
    /path/to/moodle/admin/cli/cron.php
    Im Zweifelsfall ist dies das richtige Skript. Es muss von einem "PHP CLI"-Programm auf Ihrem Computer ausgeführt werden. Der endgültige Befehl könnte also etwa so aussehen:
    /usr/bin/php /path/to/moodle/admin/cli/cron.php
    Sie können (und sollten) dies auf Ihrer Kommandozeile ausprobieren, um zu sehen, ob es funktioniert. WARNUNG: Überprüfen Sie, ob die PHP-Version auf der Kommandozeile mit der von Ihnen gewählten Moodle-Version kompatibel ist. Das Kommandozeilen-PHP-Programm unterscheidet sich von dem, das auf Ihrer Website läuft, und ist nicht immer die gleiche Version.
  2. Wenn Sie das CLI-Skript aus irgendeinem Grund nicht ausführen können, gibt es das webbasierte Skript. Beachten Sie, dass dieses Skript jetzt veraltet ist und in zukünftigen Versionen entfernt werden könnte. Es muss über einen Webbrowser ausgeführt werden und wird über eine Web-URL wie http://your.moodle.site/admin/cron.php aufgerufen. Es gibt auch kommandozeilenbasierte Webbrowser (z.B. wget), so dass der endgültige Befehl wie
    /usr/bin/wget http://your.moodle.site/admin/cron.php
    aussehen kann. Wenn Sie cron auf Ihrem Rechner nicht zum Laufen bekommen, können Sie es auch woanders ausführen.

Der webbasierte Moodle-Cron-Befehl

  • Wenn Sie die Wahl haben, verwenden Sie nicht den webbasierten Cron-Befehl. Er wird wahrscheinlich in einer zukünftigen Moodle-Version entfernt werden.
  • Ab Moodle 2.9 kann der Cron-Job standardmäßig nicht mehr über das Web ausgeführt werden. Sie werden eine Fehlermeldung erhalten:
!!! Sorry, der Internetzugang zu dieser Seite wurde vom Administrator gesperrt. !!! 
  • Sie können dies unter ' Dashboard ► Site administration ► Security ► Site policies ' ändern, indem Sie die Option 'Cron execution via command line only' deaktivieren.
    • Sie werden gewarnt, dass die Ausführung des Cron von einem Webbrowser aus privilegierte Informationen für anonyme Benutzer preisgeben kann. Es wird daher empfohlen, den Cron nur über die Befehlszeile auszuführen oder ein Cron-Passwort für den Fernzugriff festzulegen.'
    • Sie können dann ein 'Cron-Passwort für den Fernzugriff' eingeben. Wenn Sie dieses Feld leer lassen, ist kein Passwort erforderlich.
    • Dies bedeutet, dass das Skript cron.php nicht von einem Webbrowser aus ausgeführt werden kann, ohne dass das Kennwort in der folgenden Form der URL angegeben wird:
 http://site.example.com/admin/cron.php?password=opensesame

Den richtigen Ort für die Eingabe des Befehls finden

Dies hängt wirklich von dem System ab, das Sie verwenden, und Sie sollten die Dokumentation für Ihre Plattform oder Ihr Hosting finden und lesen. In den meisten Fällen besteht die Ausführung von Moodle cron darin, dass Sie den richtigen Befehl (siehe oben) festlegen und ihn dann zusammen mit der Zeit, zu der der Befehl ausgeführt werden soll, in eine Art Datei eintragen. Dies kann entweder über eine spezielle Benutzeroberfläche oder durch direkte Bearbeitung der Datei geschehen.

Wenn Sie die CLI-Version verwenden, müssen Sie auch sicherstellen, dass der Cron-Prozess als der richtige Benutzer ausgeführt wird. Dies ist bei der Web-Version nicht der Fall.

Beispiel... Installation von cron auf Ubuntu/Debian Linux. Angenommen, Sie sind als root eingeloggt...

Verwenden Sie den Befehl crontab, um ein Crontab-Editorfenster für den Benutzer www-data zu öffnen. Dies ist der Benutzer, unter dem Apache (der Webserver) auf Debian-basierten Systemen läuft

$ crontab -u www-data -e

Dadurch wird ein Editorfenster geöffnet. Um das cli cron-Skript alle 1 Minute laufen zu lassen, fügen Sie die Zeile:

* * * * * /usr/bin/php /path/to/moodle/admin/cli/cron.php >/dev/null

HINWEIS: Das abschließende >/dev/null sendet alle Ausgaben in den 'bin' und verhindert, dass Sie alle 1 Minute eine E-Mail erhalten.

cron auf Ihrem System einrichten

Wählen Sie die Informationen für Ihren Servertyp aus:

Hier sind einige weitere Anleitungen für bestimmte Hosts (bitte prüfen Sie, ob diese aktuell sind):

Verwendung eines Cron-Dienstes eines Drittanbieters

Neben der Verwendung von Cron, das auf Ihrem eigenen Server gehostet wird, können Sie auch Cron-Dienste von Drittanbietern verwenden (normalerweise webcron genannt):

  • cron-job.org ist ein kostenloser Dienst. (1Minute cron ist möglich)
  • EasyCron - Ein Webcron-Dienstleister, der die Notwendigkeit von crontab oder anderen Aufgabenplanern zum Einrichten von Cron-Jobs eliminiert.
  • WebCron - Ein kostenloser und einfacher Webcron-Dienstleister.

Cron-Einstellungen in Moodle

Ein Administrator kann die Cron-Ausführung nur über die Kommandozeile oder ein Cron-Passwort für den Fernzugriff in den "Sicherheitseinstellungen" der Website-Administration einstellen.

Ferngesteuerter Cron

Mit der 'webbasierten' Version von cron ist es völlig in Ordnung, den cron-Prozess auf einem anderen Rechner als dem Moodle-Server zu platzieren. Zum Beispiel kann der cron-Dienst auf einem Unix-Server die cron-Webseite auf einem Windows-basierten Moodle-Server aufrufen.

Planen von Aufgaben

Ein Administrator kann Cron-Aufgaben unter Administration > Website-Verwaltung > Server > Geplante Aufgaben sehr genau planen, siehe Geplante Aufgaben

Cron für mehrere Moodle-Server laufen lassen

  • Die Aufgaben können parallel laufen und die Prozesse verwenden Sperren, um zu verhindern, dass Aufgaben zur gleichen Zeit laufen, was es ermöglicht, Cron von mehreren Webservern aus zu starten, die dieselbe Moodle-Instanz bedienen.
  • Wenn Sie verschiedene Moodle-Instanzen auf demselben Server betreiben, dann benötigt jede Moodle-Instanz einen Cron-Job. (Sogar ein einzelner Apache-Webserver kann verschiedene Moodle-Instanzen auf verschiedenen Domains laufen lassen, indem er seine Fähigkeit zu virtuellen Hosts nutzt https://httpd.apache.org/docs/2.2/vhosts/index.html.)

Fehlersuche bei geplanten Tasks

Manchmal kann es vorkommen, dass eine bestimmte Cron-Aufgabe nicht richtig funktioniert. In Moodle-Versionen vor 2.7 hat jede Cron-Aufgabe, die Ausnahmen auslöste, den Rest der Cron-Aufgabe am Laufen gehindert. Die einzige Möglichkeit zu überwachen, ob Cron jedes Mal abgeschlossen wurde, war eine automatische Überprüfung der Ausgabe von Cron (z.B. die Suche nach der Zeichenkette "Cron completed at ").

In Moodle 2.7 und höher verhindert eine einzelne fehlgeschlagene geplante Aufgabe nicht die Fertigstellung der übrigen Aufgaben. Wenn eine einzelne geplante Aufgabe fehlschlägt, wird sie als Fehlschlag markiert und für einen erneuten Versuch eingeplant. Wenn die Aufgabe immer wieder fehlschlägt, wird die nächste geplante Zeit verschoben, bis sie höchstens einmal alle 24 Stunden versucht wird. Auf der Geplante Aufgaben-Verwaltungsseite können Sie jedoch sehen, ob eine Aufgabe gerade fehlschlägt (sie hat eine Fehlschlagverzögerung ungleich Null - das ist die Anzahl der Sekunden, die gewartet wird, bevor eine fehlgeschlagene Aufgabe erneut versucht wird). Eine einfache Möglichkeit, eine fehlgeschlagene Aufgabe zu debuggen, besteht darin, sie sofort mit dem cli scheduled task runner auszuführen und die Ausgabe zu überwachen.

Protokollierung und Überwachung

Idealerweise sollten Sie auch die Ausgabe von cron irgendwo protokollieren und auf Probleme hin überwachen. Sie können den Gesamtstatus von cron überwachen, um sicherzustellen, dass keine Fehler vorliegen, indem Sie Folgendes besuchen:

Website-Verwaltung / Berichte / Systemstatus (/report/status/index.php)

Sie können diesen Statusbericht auch mit Tools wie Icinga / Nagios verbinden, indem Sie die Check API (https://docs.moodle.org/dev/Check_API) cli-Befehle verwenden oder mit Hilfe von Plugins wie https://github.com/catalyst/moodle-tool_heartbeat.

/admin/cli/checks.php

Wenn Fehler auftreten, können Sie weitere Details zu kürzlich ausgeführten Tasks in der Spalte "Logs" auf der Seite "Geplante Tasks" abrufen, allerdings werden dort keine Fehler bei Ad-hoc-Tasks angezeigt:

Website-Verwaltung / Server / Aufgaben / Geplante Aufgaben (/admin/tool/task/scheduledtasks.php)

Um Fehlschläge von Ad-hoc-Aufgaben zu sehen, müssen Sie die Aufgabe entweder selbst manuell ausführen und die Fehler sehen, oder Sie müssen die Logs bereits zur Überprüfung gesammelt haben. Für ein Moodle, das auf einem einzelnen Rechner läuft, könnte man in eine einfache Logdatei protokollieren, oder für einen Cluster könnte man syslogd oder ähnliches verwenden, z.B.:

 * * * * * /usr/bin/php /path/to/moodle/admin/cli/cron.php 2>&1 | /usr/bin/logger ...

Adhoc-Aufgaben mit geringer Latenz

Jedes Mal, wenn cron ausgeführt wird, werden nach den geplanten Aufgaben auch die Ad-hoc-Aufgaben ausgeführt. Während geplante Aufgaben höchstens einmal pro Minute ausgeführt werden können, können Ad-hoc-Aufgaben jederzeit in eine Warteschlange gestellt werden, und im Allgemeinen möchten Sie, dass sie so schnell wie möglich verarbeitet werden und nicht erst auf die geplante Aufgabe warten müssen. Wenn Sie nur die normale admin/cli/cron.php ausführen, kann es sein, dass sie nicht nur warten muss, um alle geplanten Aufgaben zuerst zu bearbeiten, sondern dass Sie, wenn sie bereits beendet ist, bis zur nächsten Minute warten müssen, bis cron erneut startet, um sie zu bearbeiten.

Stattdessen können Sie einen oder mehrere spezielle Ad-hoc-Aufgabenprozessoren laufen lassen, die parallel zum Hauptprozess von cron laufen.

 * * * * * /usr/bin/php /path/to/moodle/admin/cli/adhoc_task.php --execute --keep-alive=59
 * * * * * /usr/bin/php /pfad/zu/moodle/admin/cli/adhoc_task.php --execute --keep-alive=59
...

Ab Moodle 3.9 wird die Option-keep-alive wie ein Daemon ausgeführt, d.h. wenn die Warteschlange leer ist, wird sie nicht beendet, sondern wartet darauf, dass neue Aufgaben in die Warteschlange gestellt werden, damit sie so bald wie möglich mit der Bearbeitung beginnen kann.

Cron mit mehreren Prozessen skalieren

Wenn Ihre Website wächst, werden viele der geplanten Aufgaben länger dauern, und es werden auch mehr Ad-hoc-Aufgaben in der Warteschlange stehen, die bearbeitet werden müssen. Das Cron-System ist so konzipiert, dass es parallel arbeitet, aber jeder einzelne Prozess kann nur eine Aufgabe zur gleichen Zeit bearbeiten, so dass Sie mehrere Cron-Kli's laufen lassen müssen. Sie können im Allgemeinen eine ziemlich große Anzahl von Cron-Prozessen auf einer dedizierten Cron-Instanz laufen lassen, bevor Sie mehrere Cron-Instanzen laufen lassen müssen. Um mehr als einen Prozess laufen zu lassen, starten Sie einfach jede Minute mehrere Cron-Prozesse:

* * * * * /usr/bin/php /path/to/moodle/admin/cli/cron.php
* * * * /usr/bin/php /pfad/zu/moodle/admin/cli/cron.php * * * * * /usr/bin/php /pfad/zu/moodle/admin/cli/cron.php
* * * * * /usr/bin/php /pfad/zu/moodle/admin/cli/cron.php
⋮
* * * * * /usr/bin/php /pfad/zu/moodle/admin/cli/adhoc_task.php --execute --keep-alive=59
* * * * * /usr/bin/php /pfad/zu/moodle/admin/cli/adhoc_task.php --execute --keep-alive=59
* * * * * /usr/bin/php /pfad/zu/moodle/admin/cli/adhoc_task.php --execute --keep-alive=59
⋮

Es kann besonders wichtig sein, die Anzahl der adhoc_task.php-Prozesse zu erhöhen, da bestimmte Plugins und Systeme eine sehr große Anzahl von Ad-hoc-Aufgaben oder Aufgaben erzeugen können, deren Bearbeitung viel Zeit in Anspruch nehmen kann. Insbesondere Aufgaben wie Dokumentenkonvertierungen und automatisierte Backups können sich schneller ansammeln als sie bearbeitet werden, wenn sie auf den Standardeinstellungen belassen werden.

Standardmäßig können nur 3 geplante Aufgaben und 3 Ad-hoc-Aufgaben gleichzeitig ausgeführt werden. Wenn Sie weitere Prozesse hinzufügen, müssen Sie die zulässige Gleichzeitigkeit erhöhen:

Site-Administration > Server > Tasks > Task-Verarbeitung

Oder in config.php:

$CFG->task_scheduled_concurrency_limit = 20; // Standardwert ist 3
$CFG->Aufgabe_adhoc_Währungsbeschränkung = 50; // Standardmäßig 3

Wie auch immer Sie diese Werte setzen, stellen Sie sicher, dass der/die Server, die sie hosten, diese Anzahl von Prozessen bequem verarbeiten können. Oft ist der Engpass ein gemeinsam genutzter Dienst, normalerweise die Datenbank.

Es kann vorkommen, dass bestimmte Arten von sehr lang laufenden Aufgaben alle verfügbaren Aufgabenprozesse aufbrauchen, was bedeutet, dass keine anderen Aufgaben ausgeführt werden können. Wenn Sie z. B. 5 Cli-Prozesse haben, aber in der Aufgabenwarteschlange 20 Ad-hoc-Aufgaben für eine automatische Sicherung stehen, von denen jede zehn Minuten dauert, dann werden sehr schnell alle 5 Prozesse von den Sicherungen aufgebraucht und nichts anderes. Andere kleine, sehr schnelle und leichte Aufgaben wie eine Dokumentenkonvertierung oder Foren-E-Mails werden nicht gesendet, bis die Backups abgeschlossen sind und ein Prozess frei wird. Um dies zu steuern, können Sie die Gleichzeitigkeit bestimmter Arten von Ad-hoc-Aufgaben begrenzen. Eine gute Faustregel ist, dass Sie, wenn alle "schweren" Aufgaben ihre eigenen Limits ausschöpfen, immer noch ein paar andere Prozesse im Leerlauf haben sollten, die auf alles andere warten, was der Warteschlange hinzugefügt werden könnte.

Automated backups are the worst known offender, so hypothetically if you are running 50 ad hoc task processes concurrently a reasonable restriction might be to cap the backups to consume no more than half of those processes, i.e. 25 at most:

In config.php:

$CFG->task_concurrency_limit = [
    'core\task\course_backup_task' => 25,
    'core_course\task\course_delete_modules' => 5,
];


See also

Forum discussions: