繁体   English   中英

在crontab中执行时,Perl脚本无法写入数据库,即使在手动执行时也可以写入

[英]Perl script unable to write to database when executed in crontab despite being able to write if executed manually

我已经为这个问题努力了一段时间。并且我尝试了许多解决方案,例如:

  1. 为什么DBD :: SQLite无法通过我的Perl CGI脚本插入数据库?

  2. 为什么出现sqlite错误,“无法打开数据库文件”?

简要

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

在旧服务器中 ,我有一个Perl文件,这是一个刮板,我每隔30分钟使用crontab运行一次,名为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

这些权限级别都与我的旧服务器对数据库文件以及文件夹的权限级别相同。.我还尝试对数据库文件使用chownchmod 777 ,因此它具有所有可能的权限。 仍然没有运气。

有人知道为什么吗?

手动测试时,您可能已进入脚本的正确工作目录进行编辑。 从任何其他位置启动它也很可能也导致了故障。

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

第二个建议是恕我直言,因为它在更改位置或机器时不需要更改脚本;因此,它更便于移植。 您只需在您的(特定于计算机的)crontab中调整它即可。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM