2 Stimmen

Die Verwendung von Cron mit Cake Console auf Ubuntu

Ich benötige diesen Cron-Job, um mein Shell-Skript auszuführen, genauso wie es funktioniert, wenn ich es in der Befehlszeile ausführe.

Ich habe die eine andere Frage zu diesem Thema durchgelesen, aber mein konsolenbasiertes Cron-Job funktioniert immer noch nicht. Ich möchte etwas Code und die Ausgabe posten, vielleicht kann mir jemand sagen, was los ist.

Zunächst einmal, dies läuft auf Cake 1.3. Ich verwende Ubuntu 9.10. Ich habe die Shell-Skript-Methode aus dem Cake-Buch ausprobiert.

Ich habe kein spezielles Benutzerkonto für das Ausführen des Skripts eingerichtet. Die Cake-Konsole ist in meinem PATH (für den im Ubuntu eingebauten Benutzer).

In einer anderen Frage, die ich gefunden habe, wird berichtet, dass der -app Parameter nichts bewirkt. Bei mir scheint dies auch der Fall zu sein.

Meine Shell funktioniert so, wie sie sollte, wenn ich das von der Befehlszeile ausführe:

./vendors/cakeshell subscription_reminder -cli /usr/bin -app /var/www/www.example.org/htdocs/app -console /var/www/www.example.org/htdocs/cake/console/cake

Die Ausgabe sieht dann so aus:

Willkommen bei CakePHP v1.3.2 Konsole
---------------------------------------------------------------
App : app
Pfad: /var/www/www.directory.sdcweb.org/htdocs/app
---------------------------------------------------------------

Ich protokolliere die Ausgabe meines Cron-Jobs in eine Datei und die Ausgabe davon sieht anders aus, so:

Bearbeitung: Mir ist aufgefallen, dass dieser folgende Codeblock einfach das Cake Shell-Skript ist, das mit CakePHP geliefert wird. Wenn Sie cake/console/cake in einem Texteditor öffnen, sollten Sie das folgende Skript finden.

################################################################################
#
# Bake is a shell script for running CakePHP bake script
# PHP versions 4 and 5
#
# CakePHP(tm) :  Rapid Development Framework (http://cakephp.org)
# Copyright 2005-2010, Cake Software Foundation, Inc.
#
# Licensed under The MIT License
# Redistributions of files must retain the above copyright notice.
#
# @copyright            Copyright 2005-2010, Cake Software Foundation, Inc.
# @link                         http://cakephp.org CakePHP(tm) Project
# @package                      cake
# @subpackage           cake.cake.console
# @since                                CakePHP(tm) v 1.2.0.5012
# @license                      MIT License (http://www.opensource.org/licenses/mit-license.php)
#
################################################################################
LIB=${0/%cake/}
APP=`pwd`

exec php -q ${LIB}cake.php -working "${APP}" "$@"

exit;

Mein Crontab sieht so aus:

41 20 * * * /var/www/www.example.org/htdocs/app/vendors/cakeshell subscription_reminder -cli /usr/bin -app /var/www/www.example.org/htdocs/app -console /var/www/www.example.org/htdocs/cake/console/cake >> /home/ubuntu/cron-log

0 Stimmen

Ich verstehe nicht, warum das Ausführen meiner Shell von einem Cron-Job aus nicht funktioniert, wie es funktioniert, wenn ich es auf der Befehlszeile ausführe. Siehe das erste Code-Snippet in meinem Beitrag.

2voto

mvds Punkte 44160

Zunächst einmal führt Ihr Cronjob das Skript mit einem anderen cwd aus, was das Verhalten beeinflussen kann. Ändern Sie es zu

41 20 * * * cd /var/www/www.example.org/htdocs/app/; ./vendors/cakeshell ....

Aber vielleicht gibt es etwas anderes:

Das "CakePHP-Konsolenprogramm", cakeshell, überprüft wahrscheinlich, ob sein stdin mit einem tty verbunden ist. Wenn nicht, wechselt es in einen anderen, nicht interaktiven Modus.

Der Punkt ist, dass einige Programme mit Ihnen in einem Terminal (einem tty) kommunizieren können und andere nicht.

Einige können je nach Umständen beides tun.

grep ist in der Regel nicht interaktiv

vi, pico und nano werden in der Regel nur interaktiv verwendet:

$ vi > test3
Vim: Warnung: Ausgabe erfolgt nicht an einem Terminal
$ echo bla | vi
Vim: Warnung: Eingabe erfolgt nicht von einem Terminal
$ vi < test3
Vim: Warnung: Eingabe erfolgt nicht von einem Terminal

bash kann beides (nicht interaktiv beim Ausführen von Skripten, interaktiv wenn es Sie in einem Terminal bedient)

Also zumindest gibt es die Antwort darauf, warum genau derselbe Befehl und die gleiche Umgebung völlig unterschiedliche Ausgaben liefern können. Versuchen Sie es, es wie zuvor von der Befehlszeile aus zu starten, aber leiten Sie die Eingabe entweder von einem Rohr oder einer Datei um, und sehen Sie, was sich ändert.

0 Stimmen

Danke, das sind wirklich gute Infos, es ist immer schön, von *nix-Experten zu hören!

1voto

Randy L Punkte 13918

Nun, nach etwas mehr Arbeit daran, bin ich endlich bei einem crontab angekommen, der das tut, was ich will. Es sieht so aus:

35 01 * * * cd /var/www/www.example.org/htdocs/app; ../cake/console/cake subscription_reminder

Es funktioniert nicht nur, sondern es ist auch viel lesbarer.

0voto

Oscar Punkte 1222

Beginnt Ihre cakeshell mit

#!/bin/bash

Wie im Beispiel auf http://book.cakephp.org/view/1110/Running-Shells-as-cronjobs?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X