Perl-скрипт не запускает подписки в относительном пути - PullRequest
0 голосов
/ 08 ноября 2010

У меня есть Perl-скрипт: run.pl, который вызывается cron каждую минуту.

Единственное, что run.pl делает, это вызывает два других скрипта: download.pl и parse.pl:

#!/usr/bin/perl
use warnings;
use strict;

do 'download.pl';
do 'parse.pl';
print "done!\n";

В файлах download.pl и parse.pl есть две распечатки с "готовой загрузкой" и "готовым синтаксическим анализом". Теперь я вывожу скрипт в /var/log/script.log и проверяю, чтобы скриптrun.

Сценарий run.pl работает нормально, он выводит "done!"в лог-файл.Но два других сценария не называются.Я думаю, что это проблема относительного пути, она работает, когда я использую абсолютный путь.

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

Есть ли способ запустить сценарии по относительному пути?

Редактировать: Когда я запускаю его сам из командной строки с помощью "perl run.pl", он запускает сценарии безпроблема.

Ответы [ 3 ]

5 голосов
/ 08 ноября 2010

Хм, почему вы используете do?Знаете, это не «вызывает» программу!

Являются ли эти библиотечные модули или программы?

Кроме того, ожидается, что программы будут найдены в $ENV{PATH}, тогда как библиотеки ожидаются в @INC.Это почти наверняка разные вещи.

Мой совет:

  1. Чтобы вызвать другую программу в $ENV{PATH}, используйте system() или обратные галочки.
  2. Для загрузкив библиотеке @INC, используйте require или use.
  3. Резерв do FILE для экзотических волшебных целей, которые почти наверняка здесь не применимы.
4 голосов
/ 08 ноября 2010

Задания Cron не выполняются в той же среде, в которой будет виден логин оболочки. Задание cron обычно имеет домашний каталог пользователя cron, поскольку он является рабочим каталогом по умолчанию. Один из способов обойти это - использовать FindBin, чтобы найти каталог, в котором находится скрипт, и основать на нем ваши пути.

#!/usr/bin/perl
use warnings;
use strict;
use FindBin qw($Bin);

do $Bin.'download.pl';
do $Bin.'parse.pl';
print "done!\n";

Возможно, вам лучше превратить download.pl и parse.pl в настоящие модули, это может сэкономить вам силы в долгосрочной перспективе.

0 голосов
/ 08 ноября 2010
$rootdir=`dirname "$0"`;

### call your scripts here relative to $rootdir

не помогает?

...