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>&1Oder 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:
- Anleitung von All Inkl: per Script: Shellscripte ausführen
- Anleitung von Christoph Liebig vom 26. April 2015:
HumHub richtig auf all-inkl.com installieren
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
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:
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:
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!