0

我正在尝试研究如何设置 Shell 以作为 cron 运行,我在 /app/Console/Command/TaskEmailerShell.php 使用以下代码创建了一个 TaskEmailerShell.php 文件:

App::uses('CakeEmail', 'Network/Email');

class TaskEmailerShell extends AppShell {
    public $uses = array('Task');

    public function main()
    {
        // GENERATE AND SEND THE EMAIL
        // ------------------------------------------------------------>
        $email = new CakeEmail();
        etc etc

我已按照此处的说明进行操作,当 cron 运行时出现此错误:

/home/village/public_html/app/Console/cakeshell: line 14: cake: command not found

我的 cron 命令是:

/home/village/public_html/app/Console/cakeshell TaskEmailer -cli /usr/bin -console /Cake/Console -app /home/village/public_html/app >> /home/village/public_html/emailer_log.log

有什么建议我哪里出错了吗?

4

3 回答 3

1

cakeshell您在此处引用的脚本要求cake控制台二进制文件位于 PATH 中的某个位置,或者(至少从使用示例来看),以便您使用参数指定控制台的完整路径-console。看起来你在那里有一条相对路径。

就我个人而言,我建议直接从您的 cron 作业中调用 cake 控制台。随着其他需求的出现,您最终可能会编写一个脚本cakeshell来包装控制台。你可以尝试类似的东西:

# m h dom mon dow command
*/5 *   *   *   * /home/village/public_html/lib/Cake/Console/cake -app '/home/village/public_html/app/' TaskEmailer >> /home/village/public_html/emailer_log.log
于 2012-11-09T01:04:13.613 回答
1

Command not found通常意味着你PATH的问题。从 cron 运行的程序甚至可能没有PATH设置。由 cron 启动的任何脚本都必须设置PATH在开头附近,否则它将找不到任何它应该运行的程序。

于 2012-11-09T02:48:11.807 回答
0

错误发生在文件 cakeshell: $cmd. 中的第 14 行。cmd 设置在第 4 行。

#!/bin/bash
TERM=dumb
export TERM
cmd="/opt/lampp/htdocs/MyApp/app/Console/cake"
while [ $# -ne 0 ]; do
if [ "$1" = "-cli" ] || [ "$1" = "-console" ]; then
PATH=$PATH:$2
shift
else
cmd="${cmd} $1"
fi
shift
done
$cmd

最初第 4 行是

cmd="cake"

将其更改为绝对路径,例如:

cmd="/opt/lampp/htdocs/MyApp/app/Console/cake"

其中 MyApp 是应用程序目录。即使在 PATH 设置之后,我也遇到了这个问题。然后提到绝对路径解决了它。

于 2013-04-12T06:42:57.517 回答