在Ubuntu上使用Cron和Cake Console

时间:2010-07-16 21:18:53

标签: cakephp cron cakephp-1.3

我需要这个cron作业来执行我的shell,就像我在命令行上运行它一样。

我仔细阅读了我发现的另一个问题,但我的基于控制台的cron工作仍然无法正常工作。我想发布一些代码及其输出的内容,也许有人可以告诉我发生了什么。

首先,这是在Cake 1.3上。我在Ubuntu 9.10上运行。我尝试了Cake Book中描述的shell-script method

我没有为运行脚本建立任何特殊的用户帐户。蛋糕控制台在我的PATH上(对于ubuntu内置用户)。

another question I found中,他们报告-app参数没有做任何事情。对我来说似乎也是如此。

当我从命令行运行它时,我的shell工作正常:

./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附带的蛋糕shell脚本,如果你在文本编辑器中打开cake / console / cake,你应该找到以下脚本。

################################################################################
#
# 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 个答案:

答案 0 :(得分:2)

首先,您的cronjob使用不同的cwd运行脚本,这可能会影响行为。将其更改为

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

但也许还有别的东西:

“cakephp console”,cakehell,可能会检查它的stdin是否连接到tty。如果没有,它会进入其他一些非交互模式。

关键是有些程序可以在终端(tty)与你交谈,而其他程序则不能。

根据具体情况,有些人可以同时做两件事。

grep通常是非交互式的

vipiconano通常仅以交互方式使用:

$ 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 :(得分:1)

嗯,经过多一点工作后,我终于到了一个crontab,它做了我想要的。它看起来像这样:

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

它不仅有效,而且更具可读性。

答案 2 :(得分:0)

你的蛋糕是否以

开头
#!/bin/bash

根据http://book.cakephp.org/view/1110/Running-Shells-as-cronjobs上的示例?