HumHub und die Cron Jobs

Das Problem: HumHub erfordert Shell-Zugang?

HumHub ist eine Open Source Social Networking Software, die man selbst auf einem eigenen Server installieren und betreiben kann.

Bei den Installationsanforderungen (Stand Version 1.0.1) steht zwar etwas von „Shell access (e.g. ssh) to server„, aber auch wenn man keinen Shell-Zugang hat, braucht man sich davon nicht abschrecken zu lassen.

Man sollte aber die Möglichkeit haben, Cron Jobs einzurichten. Dass man sich die notfalls auch irgendwie anders basteln kann, das ist aber nicht das Thema heute — sondern eben wie man diese Cron Jobs auch ohne Shell-Zugang einrichtet.

In HumHub unter Administration > Cron Jobs steht:

Bitte stelle sicher, dass folgende Cronjobs eingerichtet sind:

Crontab des Benutzers: wxxxxxxx
30 * * * * /www/htdocs/wxxxxxxx/humhub/protected/yii cron/hourly >/dev/null 2>&1
00 18 * * * /www/htdocs/wxxxxxxx/humhub/protected/yii cron/daily >/dev/null 2>&1

Oder Crontab des root Benutzers
*/5 * * * * su -c „/www/htdocs/wxxxxxxx/humhub/protected/yii cron/hourly“ wxxxxxxx >/dev/null 2>&1
0 18 * * * su -c „/www/htdocs/wxxxxxxx/humhub/protected/yii cron/daily“ wxxxxxxx >/dev/null 2>&1

Es sollen also Shell-Aufrufe in die Crontab eingetragen werden — aber was wenn der Provider nur zeitgesteuerte http(s)-Requests erlaubt?

Auf der Suche nach der Lösung

Man findet dazu auch woanders Anleitungen, aber die haben mir leider jeweils nur ein bisschen geholfen:

So werden die Cron Jobs auch ohne Shell-Zugang eingerichtet

Daher möchte ich die Lösung aufzeigen, mit der es bei mir geklappt hat.

Die Shell-Bridge

Wie in der Anleitung von Christoph muss man zwei Dateien anlegen, ich habe sie abgelegt unter cronbridge/do-hourly.phpx und cronbridge/do-daily.phpx

humhub-allinkl-cronjob-ftp

Inhalt der do-hourly.phpx:

<?php
$exec = '/usr/bin/php56 '.getenv('DOCUMENT_ROOT').'protected/yii cron/daily ';
exec($exec, $out, $result);
echo "Returncode: " .$result ."<br>";
echo "Ausgabe des Scripts: " ."<br>";
echo "<pre>"; print_r($out);
?>

Die Datei do-daily.phpx unterscheidet sich davon nur an einer Stelle, nämlich mit cron/daily statt cron/hourly hinten in der zweiten Zeile.

Wichtig ist /usr/bin/php56 bzw. mindestens php54 laut HumHub-Anforderungen. Denn ein einfaches /usr/bin/php kann auch eine deutlich ältere Version sein, und damit wird das nichts…

Noch zwei weitere wichtige Unterschiede zur Anleitung von Christoph, die sich vermutlich auf eine ältere HumHub-Version bezieht: das aufgerufene Script heißt „yii“ und nicht mehr „yiic“, und der Parameter heißt „cron/daily“ mit Schrägstrich statt mit Leerzeichen „cron daily“. Außerdem wird hier der Script-Pfad bequem per DOCUMENT_ROOT automatisch ermittelt.

Der Testlauf

Ein manueller Testlauf erzeugt folgende Ausgabe:

Returncode: 0
Ausgabe des Scripts:

Array
(
[0] => Executing hourly tasks:
[1] =>
[2] =>
Sending update e-mails to users… 0% (0/3) ETA: n/a
Sending update e-mails to users… 33% (1/3) ETA: n/a
Sending update e-mails to users… 66% (2/3) ETA: n/a
Sending update e-mails to users… 100% (3/3) ETA: n/a
Sending update e-mails to users… done – 0 email(s) sent.
[3] => Optimizing search index… done.
[4] =>
[5] =>
[6] => All cron tasks finished.
[7] =>
)

Das sieht gut aus, also:

Ab in die Cron Jobs damit

So wird die do-hourly.phpx in die Cronjobs bei All-Inkl eingetragen:

humhub-allinkl-cronjob-detail

Die do-daily.phpx wird entsprechend eingetragen, nur halt nicht stündlich, sondern täglich. Die beiden Einträge „HTTP Benutzer“ und „HTTP Passwort“ bei den „Zusätzlichen Einstellungen“ sind nicht erforderlich, ich habe das Verzeichnis cronbridge noch zusätzlich per .htaccess und .htpasswd gegen unbefugten Zugriff geschützt.

In der Übersicht der Cronjobs werden die beiden Einträge folgendermaßen aufgelistet:

humhub-allinkl-cronjob-list

Das Ergebnis

Am nächsten Tag sieht es dann in HumHub unter Administration > Cron Jobs etwa so aus:

CronJob Einstellungen
Status:
Letzte Ausführung (stündlich): 28 minutes ago
Letze Ausführung (täglich): about 12 hours ago

Voilá, Problem gelöst!

Über Arno Beckmann

Arno Beckmann ist Informatiker und freier Web-Entwickler, und lebt in Hamburg-Bergedorf.