Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Perl localtime


Автор: dnbattack 3.7.2011, 17:28
доброго времени суток. 
Имеется скрипт написанный коллегой для создания бэкапов. 
Недавно я заметил что папки и файлы бэкапов создаются не как раньше:
год_мес_день/имяфайла.год_мес_день_время
а так 
/ЧЧ:ММ:СС_Jul_/имяфайла.ЧЧ:ММ:СС_Мес__День
... что не очень удобно ... 
Изменений в скрипте никаких не производилось, если только обновлялась система (ubuntu 10.10)

Привожу кусок кода который явно отвечает за дату и время ...


#!/usr/bin/perl -w

< тут то что делает скрипт >

sub gettime {
        #($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)
        my ($mday, $month, $day, $time, $year) = split(/[\s' ']/, localtime(time));
        if ( !defined($_[0]) ) {
                return "$year\_$month\_$day";
        } else {
                return "$year\_$month\_$day\_$time";
        }
}

...

В Perl я новичок (если быть точнее, даже нуб) и пока мало что понимаю - буду рад любой помощи ... спасибо!

Автор: EcSYZ 3.7.2011, 17:46
Код

my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime();
$year += 1900;
$mon++;

return "$year\_$month\_$day";#ну вообщем тут уже нужный формат просто сделать


PS: хотя может стоить заглянуть в доки по localtime в Убунте, вдруг там чтото своё решили придумать  smile 

Автор: dnbattack 3.7.2011, 17:57
привел к такому виду:


Код

sub gettime {
        #($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)
        #my ($mday, $month, $day, $time, $year) = split(/[\s' ']/, localtime(time));
        my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime();
        $year += 1900;
        $mon++;
        if ( !defined($_[0]) ) {
                return "$year\_$month\_$day";
        } else {
                return "$year\_$month\_$day\_$time";
        }
}



Теперь скрипт отказывается работать вовсе ... 

/backup$ ./backup.pl 
Global symbol "$month" requires explicit package name at ./backup.pl line 196.
Global symbol "$day" requires explicit package name at ./backup.pl line 196.
Global symbol "$month" requires explicit package name at ./backup.pl line 198.
Global symbol "$day" requires explicit package name at ./backup.pl line 198.
Global symbol "$time" requires explicit package name at ./backup.pl line 198.
Execution of ./backup.pl aborted due to compilation errors.

Автор: EcSYZ 3.7.2011, 18:11
Код

sub gettime {
    my ($sec,$min,$hour,$day,$month,$year,$wday,$yday,$isdst)=localtime();
    $year += 1900;
    $month++;
    my $time="$hour:$min:$sec";
    if ( !defined($_[0]) ){
        return "$year\_$month\_$day";
    } else {
        return "$year\_$month\_$day\_$time";
    }
}

Выдаёт как и надо:
2011_7_3
2011_7_3_19:14:21

Автор: dnbattack 3.7.2011, 18:19
да, действительно ... криво набрал код ... 
Спасибо!  smile  smile 

а если не секрет из-за чего мог появится такой косяк, учитывая что ранее все работало ?

Автор: Swedman 4.7.2011, 17:33
Код

print scalar localtime();


Вывод: Mon Jul  4 18:32:36 2011

Подскажите, формат вывода где можно задать?


------------------------------------
https://www.allmetals.ru/metals/iron/producing/

Автор: arto 4.7.2011, 21:55
perldoc POSIX на предмет strftime

Автор: OutlawZ 5.7.2011, 04:22
Код

#perl

use encoding 'CP1251', STDOUT => 'CP866';

$thisday = qw(Воскресенье
                        Понедельник
              Вторник
              Среда
              Четверг
              Пятница
              Суббота)[(localtime)[6]];
              
$year    = (localtime)[5] + 1900;
print "Сегодня $thisday, $year года!\n";

05.07.2011 $ data.pl
Сегодня Вторник, 2011 года!


Опоздал, но все же выложу smile, если вы работаете в unix то удалите "use encoding 'CP1251', STDOUT => 'CP866';"

Автор: dnbattack 11.7.2011, 17:38
Продолжу обсуждение тут, 
Теперь возникла проблема с запуском скрипта с помощью cron

набрал 
crontab -e 

вписал туда 
30 5    * * *   backup-system /usr/bin/perl /home/backup-system/backup/backup.pl
(запуск каждый день в 5 часов 30 мин)

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

Система ubuntu 10.10



Автор: ssdm 13.7.2011, 13:29
Цитата(dnbattack @ 11.7.2011,  17:38)
Продолжу обсуждение тут, 
Теперь возникла проблема с запуском скрипта с помощью cron

набрал 
crontab -e 

вписал туда 
30 5    * * *   backup-system /usr/bin/perl /home/backup-system/backup/backup.pl
(запуск каждый день в 5 часов 30 мин)

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

Система ubuntu 10.10

Впишите так 
Код

30 5    * * *   backup-system /usr/bin/perl /home/backup-system/backup/backup.pl > /tmp/backup.log 2>&1


таким образом вы направите ошибки запуска скрипта в файл /tmp/backup.log 

Потом посмотрите что после неудачного в этот файл запишется.

Автор: dnbattack 13.7.2011, 23:34
Выдало

Код
 /bin/sh: 30: not found 


полез в 
/etc/crontab 

Исправил 
Код

SHELL=/bin/sh


на 
Код

SHELL=/bin/bash


перезапустил cron 

все равно говорит 
Код

/bin/sh: 30: not found


Ладно, черт с ним ... прописываю тоже самое по 
crontab -e

в логе 
Код

/bin/sh: 30: not found


 smile 

Автор: arto 14.7.2011, 06:49
если crontab -e, то зачем backup-system ?

Автор: dnbattack 18.7.2011, 01:28
Цитата(arto @ 14.7.2011,  06:49)
если crontab -e, то зачем backup-system ?

Пробовал без него - все тоже самое ....

 smile  

Автор: arto 18.7.2011, 09:51
ну значит у вас что то очень странное

Автор: ssdm 18.7.2011, 13:16
Цитата(dnbattack @ 13.7.2011,  23:34)
Выдало

Код
 /bin/sh: 30: not found 


полез в 
/etc/crontab 

Исправил 
Код

SHELL=/bin/sh


на 
Код

SHELL=/bin/bash


перезапустил cron 

все равно говорит 
Код

/bin/sh: 30: not found


Ладно, черт с ним ... прописываю тоже самое по 
crontab -e

в логе 
Код

/bin/sh: 30: not found


 smile

По моему вам к админам обращаться надо.
У вас что то с cron ом. Не в perl'е проблема.

Автор: arto 18.7.2011, 14:13
покажите crontab -l и head -5 /home/backup-system/backup/backup.pl

Автор: dnbattack 18.7.2011, 19:01
Цитата(arto @ 18.7.2011,  14:13)
покажите crontab -l и head -5 /home/backup-system/backup/backup.pl

Код

30 5    * * * /usr/bin/perl /home/backup-system/backup/backup.pl > /tmp/backup.log 2>&1



Код

backup-system@dvr-server:~$ head -5 /home/backup-system/backup/backup.pl
#!/usr/bin/perl -w
#(c) SerG

use strict;
use warnings;


Автор: arto 18.7.2011, 20:45
crontab -l | od -tc ?

Автор: dnbattack 18.7.2011, 20:48
Цитата(arto @ 18.7.2011,  20:45)
crontab -l | od -tc ?

Код

:~$ crontab -l | od -tc
0000000   3   0       5                   *       *       *       /   u
0000020   s   r   /   b   i   n   /   p   e   r   l       /   h   o   m
0000040   e   /   b   a   c   k   u   p   -   s   y   s   t   e   m   /
0000060   b   a   c   k   u   p   /   b   a   c   k   u   p   .   p   l
0000100       >       /   t   m   p   /   b   a   c   k   u   p   .   l
0000120   o   g       2   >   &   1  \n
0000130


Автор: arto 18.7.2011, 22:03
куда вы прописали свой скрипт?

crontab -e или в файл или каталог в /etc/cron* ?

Автор: dnbattack 18.7.2011, 22:11
Цитата(arto @ 18.7.2011,  22:03)
куда вы прописали свой скрипт?

crontab -e или в файл или каталог в /etc/cron* ?

Код

crontab -e

Автор: arto 18.7.2011, 22:55
тогда разбирайтесь со своими админами.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)