代码之家  ›  专栏  ›  技术社区  ›  Randy L

在Ubuntu上使用cron和cake控制台

  •  2
  • Randy L  · 技术社区  · 16 年前

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

    我通读了我发现的另一个问题,但是我基于控制台的cron作业仍然不起作用。我想发布一些代码及其输出,也许有人能告诉我发生了什么。

    首先,这是蛋糕1.3。我在Ubuntu 9.10上跑步。我试过了 shell-script method 在蛋糕书中描述。

    我没有为运行脚本建立任何特殊的用户帐户。蛋糕控制台在我的路径上(为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作业输出记录到一个文件中,其输出看起来不同,如下所示:

    编辑:我注意到下面的代码块只是cakephp附带的cake 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 回复  |  直到 14 年前
        1
  •  2
  •   mvds    16 年前

    首先,cronjob使用不同的cwd运行脚本,这可能会影响行为。把它改成

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

    但也许还有别的原因:

    “cakephp控制台”,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 两者都可以(运行脚本时为非交互式,在终端中为您服务时为交互式)

    所以至少有一个答案可以解释为什么完全相同的命令和环境可以给出完全不同的输出。试着从命令行启动它,但是从管道或文件重定向输入,然后看看有什么变化。

        2
  •  1
  •   Randy L    16 年前

    好吧,在做了更多的工作之后,我终于找到了一个可以做我想做的事情的crontab。看起来是这样的:

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

    它不仅可以工作,而且可读性更高。

        3
  •  0
  •   Oscar    16 年前

    你的硬化是从

    #!/bin/bash
    

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