【问题标题】:deleteDirectory not working as Cron jobdeleteDirectory 不能作为 Cron 作业工作
【发布时间】:2015-08-25 20:38:10
【问题描述】:

我有一个作业,我希望 cron 以给定的时间间隔运行,这会从我的数据库中删除一些旧条目,然后删除与 db 条目一起上传的文件。

如果我从终端运行任务,它工作正常,(删除数据库条目和上传的文件)。但是当我将任务留给 cron 时,它确实会删除 db 中的条目,但不会删除我的公共目录中上传的文件夹。

删除文件的代码如下所示

$machtiging = File::files('icec/'.$icecconsult->accesstoken.'            /machtiging');

if(count($machtiging) > 0){
    File::deleteDirectory(public_path() . '/icec/'.$icecconsult->accesstoken);
}

所以它看起来是否存在,如果存在,则删除它们,但这不起作用,我尝试让 cron 作业以 root 、 www-data 和我的用户身份运行,所有结果都相同。文件和文件夹权限我已经将它们设置为 777 以确保,但这似乎不是问题。

我也尝试过添加 shell=/bin/bash 但这也没有成功

对于解决此问题的任何帮助将不胜感激

更新 crobline 看起来像这样

* * * * * /bin/bash /home/ice/verlopenicec.sh >> /tmp/output 2&>1

也试过了

* * * * * /home/ice/verlopenicec.sh >> /tmp/output 2&>1

* * * * * /usr/bin/php /var/www/wemedic/artisan verwijder-verlopen-icec-consult 1>> /dev/null 2>&1

一切似乎都在运行。它只是它不会删除或移动它需要的目录 尝试获取一些调试数据,但没有显示任何内容

verlopenicec.sh 脚本本身看起来只是对 laravel 应该运行的原始脚本的引用。制作一个脚本来测试为什么 laravel 不删除目录可能会很方便。

脚本看起来像这样

#!/bin/bash
SHELL=/bin/bash
USER=ice
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

/usr/bin/php /var/www/wemedic/artisan verwijder-verlopen-icec-consult

wich 运行一个类似这样的 laravel 命令

    $icecconsult = Icecconsult::where('id', '=', $consult_id)->firstOrFail();
    $icecconsult->expire = Carbon::now();
    $icecconsult->status = 'Gesloten';
    $icecconsult->save();

    $icec = Icec::where('id', '=', $icecconsult->icec_id)->firstOrFail();
    $icec->delete();

    $machtiging = File::files('icec/'.$icecconsult->accesstoken.'/machtiging');

    if(count($machtiging) > 0){
//            File::deleteDirectory(public_path() . '/icec/'.$icecconsult->accesstoken);
        $move = 'mv /var/www/wemedic/public/icec/'.$icecconsult->accesstoken.'  /tmp' ;
        shell_exec('SHELL=/bin/bash');
        shell_exec('PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games');

        shell_exec($move);
//             File::deleteDirectory('/var/www/wemedic/public/icec/'.$icecconsult->accesstoken);
    }


    return;

(我注释掉了删除功能并尝试将其移动到临时目录,但移动或删除的结果相同。如果我直接运行它,但不是当 cron 运行它时,两者都有效。cron 确实运行任务,因为我可以看到它在 /var/log/syslog 中被触发,并且数据库entru 确实发生了变化) 我试过删除,然后将其移动到临时文件夹,如果我直接运行它们,它们都可以工作,但是当我将它留给 cron/laravel cron 调度程序时,它们都不起作用

如果还尝试从删除函数中获取响应 (tru/false),但是当我尝试将其保存到 db 以查看它时,该函数似乎没有执行。

dd($machtiging) 返回一个如下所示的数组,显示文件夹中的文件,在知道文件夹中有文件后,它应该继续删除整个文件夹以及其中的所有文件/子目录

array:1 [▼
0 => "icec/a89ce4c9010e0a745308b29782b5eeae/machtiging/machtiging.pdf"
]

感谢您的帮助

【问题讨论】:

  • 如果是我,我会添加一些 logging 以帮助了解正在发生的事情 - 例如。转储$machtiging 的内容并记录File::deleteDirectory 返回的内容(它是真或假 - 如果有错误,它不会抛出异常。)

标签: bash laravel cron schedule delete-directory


【解决方案1】:

试试这个 crontab:

*/1 * * * * ice /bin/bash /home/ice/verlopenicec.sh >> /tmp/output.log

将您的 bash 脚本更改为:

#!/bin/bash
moment="`/bin/date +%y_%m_%d`"
echo "--- The script has been executed on $moment ---"
/usr/bin/php /var/www/wemedic/artisan verwijder-verlopen-icec-consult

它应该会更好,但如果不是,你能把你生成的 /tmp/output.log 的内容粘贴到这里吗?

【讨论】:

  • 我试过了,但没用,我必须从 cron 作业中删除冰(用户),而不是运行。这可能是因为 cron 已经来自该用户(sudo crontab -u ice -e), output.log 只显示 echo 命令,没有更多信息 --- 脚本已在 15_08_25 上执行 --- 我不得不说,我不知道到底发生了什么,我已经重新启动了一些 php artisan clean:compled , php artisan cache:clear。 (不理解链接)。但是现在当我像以前一样从终端运行命令时,它不再删除文件夹
  • 如果我在控制器中运行它(按下页面上的按钮后),它仍然会删除文件夹,但不会像以前那样从命令行删除。现在我完全不明白发生了什么。但感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 2014-11-22
  • 2012-02-18
  • 1970-01-01
  • 2018-10-24
  • 1970-01-01
  • 1970-01-01
  • 2014-12-15
相关资源
最近更新 更多