Скрипт Perl не может записать в базу данных при выполнении в crontab, несмотря на то, что может писать при выполнении вручную

1

Я уже давно борюсь с этой проблемой.. и я пробовал много решений, таких как:

  1. Почему DBD :: SQLite не может вставляться в базу данных через мой сценарий CGI Perl?

  2. Почему я получаю ошибку sqlite, "невозможно открыть файл базы данных"?

краткое

Несколько недель назад я перенес свой сервер с Laravel 4.0 на другой сервер, который теперь является последней версией Laravel 5.0.

На старом сервере у меня есть этот файл Perl, который скребок, который я запускаю с помощью crontab каждые 30 минут, называется getListOfClasses.pl

Используя следующую команду crontab на моем OLD- сервере, я запустил бы это:

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 в файле базы данных, чтобы он имел все разрешения. Еще не повезло.

Кто-нибудь знает почему?

  • 2
    От какого пользователя запускается cron? В отличие от пользователя, который запускает скрипт вручную?
  • 0
    @JRD Как мне это проверить?
Показать ещё 10 комментариев
Теги:
crontab

1 ответ

2
Лучший ответ

При тестировании вручную вы, вероятно, перешли к правильному рабочему каталогу для сценария для редактирования. Запуск его из любого другого места, скорее всего, также вызвал сбой.

  • Используйте абсолютные шаблоны вместо относительного, чтобы убедиться, что вы обращаетесь к правильному и существующему каталогу.
  • Включить cd/some/where ; перед вашей командой в кронтабе. Cron устанавливает домашний каталог, независимо от того, где находится вызываемая программа.

Второе предложение - это более переносимое, поскольку оно не требует изменений скриптов при изменении местоположения или машины; вы просто приспосабливаете его в своем (машинный) crontab.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню