Есть перловый скрипт, он должен отрабатывать по крону, выдирать из MySQL некие данные, пихать их в файл и выкладывать файлы на ftp.
если он запускается из консоли - то все работает как часы, если же его запускать по крону, напрямую, или из шел-скрипта (типа там зайти в папку где лежит перловый скрипт, и запустить перловый скрипт), то файл на фтп не закачиватся.
вот кусок:use NET::FTP;
$ftp = Net::FTP->new("xxx.xxxx.ru", Debug => 2);
wlog " Connecting to FTP-Server";if ($ftp == NULL)
{
wlog " Could not connect to FTP-Server! Exit.";
exit(9);
}if($ftp->login("anonymous",'xxx@'))
{
wlog " Logging on to FTP-Server";
if ($ftp->cwd("xxx"))
{
$ftp->ascii;
while (my $ln = $result->fetchrow_hashref())
{
$fh = new IO::File $ln->{'id'}, "w";
if (defined $fh)
{
print <$fh>;
$fh->print("293\n");
$fh->print($ln->{'head'});
$fh->print("\n");
$fh->print($ln->{'text'});
undef $fh;
$lst=$ln->{'id'};
wlog " Creating tempfile: ID=".$lst;
sleep 2
if ($ftp->put($lst))
{
wlog " File ".$lst." sucsessfuly upload to FTP-Server!";
}
else
{
wlog " Cannot upload file ".$lst." to FTP-Server! Exit. $!";
exit(4);
}
wlog " Could not delete $fh\n" unless unlink($lst);
}
}
}
else
{
wlog " Could not change directory to xxxx! Exit.";
exit(6);
}
}
else
{
print "Could not login with user!";
wlog " Could not login to FTP-Server Vessolink! Exit.";
exit(7);
}В моих логах все что пишется так это, когда через крон:
2003.10.20 18:45:12 Cannot upload file 20031020174233 to FTP-Server! Exit. Bad file descriptor
какой минимальный код приводит к ошибке?сравни environment в котором выполняется скрипт по cron с тем что у тебя в shell.
что будет если в скрипте cd в нужную директорию?
ошибка-то "bad file descriptor"
запусти cron'ом скрипт:set > /tmp/environment.txt 2>&1
и сравни результат с твоим set|less
хотя может быть ответ вообще не в тему, просто я однажды имел траблы с кроном, пока не прописал _везде_ полные путиили назначать cwd
я наверное буду выглядеть полным идиотом, но скажу что они различаются.
вот при запуске руками:addsuffix
argv ()
cwd /bhome/part3/01/viac/vcgi
dirstack /bhome/part3/01/viac/vcgi
echo_style bsd
edit
filec
gid 310
group gcc
history 100
home /bhome/part3/01/viac
killring 30
mail /var/mail/viac
owd /bhome/part3/01/viac
path (/bbs /bin /sbin /usr/bin /usr/sbin /usr/local/bin .)
prompt %#
prompt2 %R?
prompt3 CORRECT>%R (y|n|e|a)?
savehist 100
shell /usr/local/bin/tcsh
shlvl 1
status 0
tcsh 6.12.00
term cons25r
tty
uid 3441
user viac
version tcsh 6.12.00 (Astron) 2002-07-23 (i386-intel-FreeBSD) options 8b,nls,dl,al,kan,sm,rh,color,dspm,filecи при запуске через крон:
USER=viac
HOME=/bhome/part3/01/viac
PERLLIB=/bhome/part3/01/viac/perllib
PS1='$ '
OPTIND=1
PS2='> '
LOGNAME=viac
PPID=18417
PATH=/usr/bin:/bin
GECOS=viac.ru
LD_PRELOAD=/usr/local/lib/libpwd_dbenv.so
SHELL=/bin/sh
IFS='
'
TZ=Europe/Moscow
Чего там может не хватать для запуска?
я наверное буду выглядеть полным идиотом тоже, т.к. в bsd не разбираюсь, а у тебя там еще tcsh (ваще не в курсах)видимо я тебя не в ту степь затащил.
Или дело в запуске из-под крона или скрипт на перле с ошибкой.
еще разок:
-какой минимальный код приводит к ошибке?
-запиши в начале скрипта chdir /bhome/part3/01/viac/vcgi
-пропиши везде полные пути
-добавь в скрипт , чтобы на каждый чих писал в лог, код последней операции,итдBad file descriptor - это он про $fh ругается
т.е. где-то здесь порыться надо
$fh = new IO::File $ln->{'id'}, "w";
print $fh; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< чо напишет на это?
if (defined $fh)
{
print <$fh>;
$fh->print("293\n");
$fh->print($ln->{'head'});
$fh->print("\n");
$fh->print($ln->{'text'});
undef $fh;
$lst=$ln->{'id'};
wlog " Creating tempfile: ID=".$lst;
sleep 2
if ($ftp->put($lst))
{
wlog " File ".$lst." sucsessfuly upload to FTP-Server!";
}
else
{
wlog " Cannot upload file ".$lst." to FTP-Server! Exit. $!";
exit(4);
}
wlog " Could not delete $fh\n" unless unlink($lst);
}
это вот первое что в голову приходит>если он запускается из консоли - то все работает как часы,
>если же его запускать по крону, напрямую, или из шел-скрипта (типа там >зайти в папку где лежит перловый скрипт, и запустить перловый скрипт), то >файл на фтп не закачиватся.
>Чего там может не хватать для запуска?
>я наверное буду выглядеть полным идиотом тоже, т.к. в bsd не
>разбираюсь, а у тебя там еще tcsh (ваще не в курсах)
я тоже, это нам провайдером предоставлено>Или дело в запуске из-под крона или скрипт на перле с ошибкой.
В том то и дело, что я не могу определить, где именно ошибка, переписка с суппортом провайдера ничего не дает, там сидят такие же дубы как и я, похоже>еще разок:
>-какой минимальный код приводит к ошибке?
вот когда отключаешь ту часть, комментаришь про именно закачку уже файла:
>if ($ftp->put($lst))
то все ок, ошибок нет>-запиши в начале скрипта chdir /bhome/part3/01/viac/vcgi
вот отсюда
>-пропиши везде полные пути
>-добавь в скрипт , чтобы на каждый чих писал в лог, код
>последней операции,итд
до сюда есть все, ругаецца только исключительно на то что я прописал.>Bad file descriptor - это он про $fh ругается
>т.е. где-то здесь порыться надо
>$fh = new IO::File $ln->{'id'}, "w";
>print $fh; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< чо напишет на это?
>if (defined $fh)
>{
>print <$fh>;
>это вот первое что в голову приходитIO::File=GLOB(0x8390180)
IO::File=GLOB(0x8390198)
IO::File=GLOB(0x8390090)
IO::File=GLOB(0x839feac)
IO::File=GLOB(0x839fee8)
IO::File=GLOB(0x839fe58)
IO::File=GLOB(0x8390024)
IO::File=GLOB(0x839ff18)
IO::File=GLOB(0x839fe04)вот так он пишет... но у меня то берется $lst, а оно берется из базы, типа как дата, из него формируется имя файла.
>>если он запускается из консоли - то все работает как часы,
>>если же его запускать по крону, напрямую, или из шел-скрипта (типа там >зайти в папку где лежит перловый скрипт, и запустить перловый скрипт), то >файл на фтп не закачиватся.
Хе-хе...
Кому интересно будет: Надо было просто перевести себя в Passive что бы закачивать файлы.. :-)
>Хе-хе...
>Кому интересно будет: Надо было просто перевести себя в Passive что бы
>закачивать файлы.. :-)а какже с консоли то работало??