Работа с Perl

 2008.12.02
версия 1.01
24pm@mail.ru

Проверить, что модуль perl установлен можно следующей командой:
# perl -e "use Net::Server"
если ответа на эту команду нет, значит модуль установлен, иначе perl покажет где он ищет свои библиотеки:
Can't locate Net/Server.pm in @INC (@INC contains: /etc/perl /usr/local/lib/perl/5.8.4 /usr/local/share/perl/5.8.4 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.8 /usr/share/perl/5.8 /usr/local/lib/site_perl .) at -e line 1.
BEGIN failed--compilation aborted at -e line 1.


Некоторые скрипты могут требовать запуска в режиме setuid, то есть от имени другого пользователя. Убедимся, что у файла /usr/bin/sperl5.8.7 есть права -rws--x--x иначе программа не будет работать. У меня был случай, когда права были -rwx--x--- и в результате squid упал из-за отказа редиректора запускаться, а в cache.log появилась запись:

Can't do setuid (cannot exec sperl)

можно увидеть также:

Can't do seteuid!

Необходимые права устанавливаем командой:
# chmod 4711 /usr/bin/sperl5.8.7

CPAN

CPAN - огромное хранилище ресурсов (библиотек и приложений) написанных на Perl, имеющие зеркала по всему миру.
У этого хранилища есть своё одноимённое приложение (командрый интерпретатор) - интерфейс доступа к ресурсам. Пакеты можно устанавливать как с его помощью, так и вручную. Рассмотрим оба варианта:
1) Установим командный интерпретатор:
# apt-get install perl-CPAN
При настройке CPAN будет спрошено расположение некоторых приложений. Установим их сразу (если установлены, то не страшно, apt об этом скажет и проигнорирует):
# apt-get install gzip tar unzip make lynx wget
у меня не было установлено из запрашиваемых следующее: ncftpget, ncftp, ftp. Но это, как я понял альтернативы wget и без них всё работает нормально. Заходим в командную оболочку CPAN:
# cpan
Your terminal expects ISO-8859-1 (yes/no)? [yes] no

- Вот как выглядит обычная установка модуля:
cpan> install DBD::SQLite2

...
 CPAN.pm: Going to build M/MS/MSERGEANT/DBD-SQLite2-0.33.tar.gz

Checking if your kit is complete...
Looks good
Undefined subroutine &DBI::DBD::dbd_postamble called at Makefile.PL line 24.
Running make test
  Make had some problems, maybe interrupted? Won't test
Running make install
  Make had some problems, maybe interrupted? Won't install

Как видно нужный нам модуль не хочет устанавливаться, так как не удовлетворена зависимость, т.е. не установлен модуль DBI::DBD. Сначала нужно установить его.
- Если настройки не изменяли, то скаченные файлы cpan кладёт в домашний каталог пользователя ~/.cpan

2)
Теперь рассмотрим установка вручную. Ищем нужный модуль или приложение на http://search.cpan.org/
- Если нужно установить *.pm файл, то просто копируем его в пути поиска perl'a своих библиотек (см выше).
- Если пакет нужно ещё собрать, что происходит чаще, то скачав исходники в архиве tar.gz, распаковываем их ,и, зайдя в распакованный каталог с именем пакета, выполняем командамы:
# perl Makefile.PL
# make test
# make install
и модули сами раскладываются по нужным каталогам.


Однажды, после обновления Perl, приложение logwatch выдало такую ошибку:

ERROR: Date::Manip unable to determine TimeZone.
See 'perldoc Date::Manip' (section TIMEZONES), which describes valid TimeZones and where they can be defined.

Прочитав предложенную документацию:
# perldoc Date::Manip
стало понятно, что ему не известна моя временная зона KRAT. Список известныx ему зон находится в этой же документации. Зону он ищет последовательно в следующих местах:

$Date::Manip::TZ (set with Date_Init or in Manip.pm)
$ENV{TZ}
the unix `date` command (if available)
$main::TZ
/etc/TIMEZONE
/etc/timezone

Для исправления ситуации я использую второе место поиска. Определяем значение переменной $ENV
# echo $ENV
/root/.bashrc
В файле /root/.bashrc определяем переменную TZ, выбрав из списка подходящую нам зону (у меня ICT) и добавляем её в список экспортитуемых:

PATH=/root/bin:/sbin:/usr/sbin:/usr/local/sbin:/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
ENV=$HOME/.bashrc
USERNAME="root"
TZ=ICT
export USERNAME ENV TZ PATH

Теперь осталось применить этот профиль. Не помню как это делается командой, поэтому можно либо выйти пользователем из системы и заново зайти, либо сделать экспорт переменной вручную:
# TZ=ICT
# export TZ
# echo $TZ
ICT
- Проверяем внесённые изменения:
# date
Wed Feb 1 10:18:01 ICT 2006
Но как вскоре выяснилось проблема была решена только при запуске вручную, при вызове из crontab возникает та же ошибка. Поэтому для crontab создадим скрипт /etc/logwatch/scripts/logwatch.sh:

TZ=ICT
PATH=/root/bin:/sbin:/usr/sbin:/usr/local/sbin:/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
export TZ PATH
/etc/logwatch/scripts/logwatch.pl


Обсудить, спросить
на форуме
Новую версию этого документа можно получить на одном из зеркал сайта:
pm4u.opennet.ru, pm4u.narod.ru