簡體   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