Perl脚本在crontab中执行时无法写入数据库,尽管如果手动执行则能够写入

时间:2015-11-03 05:46:31

标签: php mysql perl sqlite crontab

我现在已经和这个问题搏斗了一段时间..我尝试了很多解决方案,例如:

  1. Why can't DBD::SQLite insert into a database through my Perl CGI script?

  2. Why do I get sqlite error, “unable to open database file”?

  3. 几周前,我将服务器从Laravel 4.0迁移到另一台服务器,该服务器现在是Laravel 5.0的最新版本。

    在旧服务器中,我有这个Perl文件,它是一个刮刀,我每30分钟使用一个名为getListOfClasses.pl

    的crontab运行

    在我的 OLD 服务器上使用以下crontab命令,我会运行此命令:

    0,30 * * * * /var/www/loop/storage/scripts/getListOfClasses.pl  >> /var/www/loop/storage/logs/laravel-scraper.log 2>&1
    

    /var/www/loop/storage/scripts/getListOfClassesFromSubjects.pl中执行刮刀并在/var/www/loop/storage/database.sqlite

    中写入我的数据库

    移动后,Laravel 5.0将默认数据库位置从storage更改为database,因此我编辑了我的crontab以反映该更改以及来自的数据库名称:

    my $dbFile = '../storage/database.sqlite';
    

    到新文件路径位置

    my $dbFile = '../../database/database.sqlite';
    

    问题

    如果我在以下地方手动操作我的刮刀:

    /var/www/schedulizer/storage/scripts/getListOfClasses.pl
    

    我能够刮得很好。但是,如果我依赖crontab来执行脚本,我会收到以下错误:

    DBI connect('dbname=../../database/database.sqlite','',...) failed: unable to open database file at /var/www/schedulizer/storage/scripts/getListOfClasses.pl line 22.
    

    第22行是my $dbh = DBI->connect($dsn, $user, $password, {。我不相信这行代码是相关的 - 我想我的服务器在写入该数据库时遇到了问题。

    我的SQLite数据库拥有的权限如下:

    -rwxrwxrwx 1 www-data root 8845312 Nov  3 00:05 database.sqlite
    

    数据库所在的文件夹具有以下权限:

    drwxr-xr-x  5 www-data root       4096 Nov  3 00:05 database
    

    这些权限级别与我旧服务器对数据库文件和文件夹的权限级别相同。我还尝试了chownchmod 777在数据库文件上,所以它具有所有权限。仍然没有运气。

    任何人都有线索为什么?

1 个答案:

答案 0 :(得分:2)

手动测试时,您可能会进入正确的工作目录以便脚本进行编辑。从任何其他位置开始也很可能导致失败。

  • 使用绝对路径而不是相对路径以确保您访问正确的现有目录。
  • 在crontab中包含cd /some/where ;命令之前。无论被调用的程序在哪里,Cron都会设置您的主目录。

第二个提案是可移植的,因为当位置或机器改变时它不需要更改脚本;你只需在你的(机器特定的)crontab中进行调整。