Использование Cron с Cake Console в Ubuntu - PullRequest
2 голосов
/ 17 июля 2010

Мне нужно, чтобы эта задача cron выполняла мою оболочку так же, как и при запуске ее из командной строки.

Я прочитал еще один вопрос, который нашел по этому поводу, но моя консольная работа cron все еще не работает. Я хочу опубликовать некоторый код и что он выводит, может быть, кто-то может сказать мне, что происходит.

Во-первых, это на Cake 1.3. Я работаю на Ubuntu 9.10. Я попробовал метод сценария оболочки , описанный в Cake Book.

Я НЕ создал никакой специальной учетной записи для запуска скрипта. Консоль Cake находится у меня в PATH (для встроенного пользователя Ubuntu).

В другом вопросе, который я нашел , они сообщают, что параметр -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

вывод этого выглядит следующим образом:

Welcome to CakePHP v1.3.2 Console
---------------------------------------------------------------
App : app
Path: /var/www/www.directory.sdcweb.org/htdocs/app
---------------------------------------------------------------

Я записываю свои выходные данные cron-job в файл, и выходные данные выглядят иначе, например:

РЕДАКТИРОВАТЬ: я заметил, что следующий блок кода является просто сценарий оболочки оболочки, который поставляется с CakePHP, если вы откроете торт / консоль / торт в текстовом редакторе, вы должны найти следующий сценарий.

################################################################################
#
# 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;

Мой crontab выглядит так:

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

Ответы [ 3 ]

2 голосов
/ 17 июля 2010

Прежде всего, ваш cronjob запускает скрипт с другим cwd, что может повлиять на поведение. Измените его на

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

Но, может быть, есть что-то еще:

"CakePhill console", cakeshell, вероятно, проверяет, подключен ли он через stdin к tty. Если нет, то он переключается в другой неинтерактивный режим.

Дело в том, что некоторые программы могут общаться с вами в терминале (tty), а другие - нет.

Некоторые могут сделать и то, и другое, в зависимости от обстоятельств.

grep обычно не интерактивен

vi, pico и nano обычно используются только в интерактивном режиме:

$ vi > test3
Vim: Warning: Output is not to a terminal
$ echo bla | vi
Vim: Warning: Input is not from a terminal
$ vi < test3
Vim: Warning: Input is not from a terminal

bash может делать и то, и другое (неинтерактивно при запуске скриптов, интерактивно при обслуживании в терминале)

Так что, по крайней мере, есть ответ, почему одна и та же команда и среда могут давать совершенно разные результаты. Попробуйте запустить его из командной строки, как вы это делали, но перенаправьте ввод из канала или файла и посмотрите, что изменится.

1 голос
/ 17 июля 2010

Ну, после еще немного работы над этим я наконец пришел к crontab, который делает то, что я хочу. Это выглядит так:

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

Мало того, что это работает, но и намного более читабельно.

0 голосов
/ 17 июля 2010

Начинается ли ваша оболочка с

#!/bin/bash

Как в примере с http://book.cakephp.org/view/1110/Running-Shells-as-cronjobs?

...