Почему мой Perl-скрипт не может загрузить модуль при запуске cron? - PullRequest
3 голосов
/ 16 апреля 2009

У меня есть куча сценариев Perl, которые все отлично работают, но должны иметь use Plibdata; наверху.

Я установил задание cron, которое запускается (я получаю письмо с подтверждением от root), и оно выдает следующее сообщение об ошибке:

Can't locate Plibdata.pm in @INC (@INC contains: /install/lib /opt/perl58/lib/5.8.8/IA64.ARCHREV_0-thread-multi /opt/perl58/lib/5.8.8 /opt/perl58/lib/site_perl/5.8.8/IA64.ARCHREV_0-thread-multi /opt/perl58/lib/site_perl/5.8.8 /opt/perl58/lib/site_perl .) at ./x line 5.

BEGIN failed--compilation aborted at ./x line 5.

Строка 5 ... вы уже догадались .... use Plibdata;

Я также пытаюсь настроить среду таким образом:

use lib "$ENV{CARSPATH}/install/lib";

так, может быть, если бы я нашел местоположение этих плибданных, я мог бы явно направить его таким образом?

Мои команды cron будут выполняться с использованием /usr/bin/sh говорит crontabs ...

Есть предложения?

Этот скрипт работает из командной строки.

Ответы [ 6 ]

7 голосов
/ 16 апреля 2009

Вы не говорите, что такое Плибдата. Вы также не указываете, работает ли это в командной строке. Я предполагаю, что это так.

Попробуйте это:

perl -MPlibdata -e 1

Предполагая, что эта ошибка не выдается, попробуйте следующее:

perl -MPlibdata -le 'print $INC{"Plibdata.pm"}'

Это скажет вам, где. (Вероятно, это в вашем env var PERL5LIB, если это работает.) Затем вы можете просто добавить соответствующий «use lib» в каталог, в котором находится Plibdata.pm.

Кроме того, убедитесь, что вы используете один и тот же perl в обоих местах - в командной строке («which perl») и в задании cron (попробуйте «BEGIN {print $ ^ X}» вверху вашего скрипта).

6 голосов
/ 16 апреля 2009

Cron использует другого пользователя env, чем ваш env при входе в систему. Можете ли вы запустить скрипт из командной строки? Если это так, просто установите переменные env внутри cron над текущими командами.

5 голосов
/ 16 апреля 2009

Очевидно, что Plibdata.pm не установлен в пути модулей по умолчанию в вашей системе:

/install/lib /opt/perl58/lib/5.8.8/IA64.ARCHREV_0-thread-multi /opt/perl58/lib/5.8.8 /opt/perl58/lib/site_perl/5.8.8/IA64.ARCHREV_0-thread-multi /opt/perl58/lib/site_perl/5.8.8 /opt/perl58/lib/site_perl

У вас есть три варианта:

  1. Установите Plibdata.pm по известному системному пути Perl (site_perl - классический вариант).

  2. Включите в среду оболочки PERL5LIB (или эквивалентную опцию командной строки -I для Perl) путь установки модуля.

  3. Используйте use lib в вашем скрипте. Помните, что действие use lib выполняется во время компиляции, поэтому ваша переменная в пути может быть не инициализирована. Попробуйте использовать переменную в блоке BEGIN следующим образом:

    my $env;
    
    BEGIN {
      $env = $ENV{CARSPATH};
    }
    
    use lib "$env/install/lib";
    
2 голосов
/ 16 апреля 2009

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

Если вы используете современный cron, вы можете сделать что-то подобное в своей записи в crontab:

* * * * * CARSPATH=/opt/carsi x

замена звездочек на соответствующие обозначения расписаний.

Это установит CARSPATH для процесса x и позволит использовать оператор lib, который передает переменную среды.

Вы также можете, в зависимости от вашей оболочки и реализации cron, сохранить настройки среды в файле и сделать что-то вроде:

* * * * * source specialenv.sh && x

Где specialenv.sh содержит такие строки, как (для bash)

export CARSPATH=/opt/carsi

Вы также можете установить переменные окружения непосредственно в crontab, если вы решите это сделать.

2 голосов
/ 16 апреля 2009

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

пример сценария оболочки:

#!/bin/bash

source ~username/.bash_profile
cd ~username
./script.pl

Если вы используете ksh или sh, вам может потребоваться сказать

#!/bin/sh

. ~username/.profile
cd ~username
./script.pl

Не забудьте заменить имя пользователя вашим именем в системе. Кроме того, если скрипт не находится в вашем домашнем каталоге, вы захотите выполнить его с указанием пути к нему, а не ./.

Вы говорите source, или интервал, чтобы загрузить данный сценарий оболочки в текущую оболочку. Вы загружаете его в текущую оболочку, чтобы любые параметры среды оставались в текущей оболочке.

~/.bash_profile, ~/.bashrc, ~/.profile, /etc/profile и т. Д. - все файлы, которые обычно содержат настройки среды. Какой из них вы используете, сильно зависит от вашей ОС и от того, кто ее настроил.

0 голосов
/ 16 апреля 2009

Хотя это и не «ответ», я решил эту проблему, используя DBI вместо Plibdata.

Это немного молочно, потому что теперь мне придется поменять пару сценариев вокруг ... аххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххххх Вон В, если бы я мог что-то сделать, чтобы заставить работать Plibdata

Я все еще собираюсь попробовать Chas. Ответ Оуэнса, чтобы увидеть, если это работает


у меня не сработало ... "переводчик" / bin / bash "не найден"
может быть, это сработает с людьми, у которых есть этот переводчик



* * * * * CARSPATH=/opt/carsi ./x

работает

...