我现在已经和这个问题搏斗了一段时间..我尝试了很多解决方案,例如:
Why can't DBD::SQLite insert into a database through my Perl CGI script?
几周前,我将服务器从Laravel 4.0迁移到另一台服务器,该服务器现在是Laravel 5.0的最新版本。
在旧服务器中,我有这个Perl文件,它是一个刮刀,我每30分钟使用一个名为getListOfClasses.pl
在我的 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
这些权限级别与我旧服务器对数据库文件和文件夹的权限级别相同。我还尝试了chown
和chmod 777
在数据库文件上,所以它具有所有权限。仍然没有运气。
任何人都有线索为什么?
答案 0 :(得分:2)
手动测试时,您可能会进入正确的工作目录以便脚本进行编辑。从任何其他位置开始也很可能导致失败。
cd /some/where ;
命令之前。无论被调用的程序在哪里,Cron都会设置您的主目录。第二个提案是可移植的,因为当位置或机器改变时它不需要更改脚本;你只需在你的(机器特定的)crontab中进行调整。