2

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

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

首先,这是在 Cake 1.3 上。我在 Ubuntu 9.10 上运行。我已经尝试过Cake Book 中描述的shell-script 方法。

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

我发现的另一个问题中,他们报告 -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 附带的 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
4

3 回答 3

2

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

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

但也许还有别的东西:

“cakephp 控制台” cakeshell 可能会检查它的标准输入是否连接到 tty。如果没有,它会进入其他一些非交互模式。

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

有些人可以两者兼得,视情况而定。

grep通常是非交互式的

vipico并且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两者都可以(运行脚本时非交互,在终端中为您服务时交互)

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

于 2010-07-16T23:59:13.013 回答
1

好吧,在做了更多的工作之后,我终于找到了一个可以满足我要求的 crontab。它看起来像这样:

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

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

于 2010-07-17T01:37:18.477 回答
0

你的蛋糕壳是否以

#!/bin/bash

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

于 2010-07-16T22:54:29.380 回答