Работа с Perl
Проверить, что модуль 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