Неправильное время на FreeBSD — это не страшно. UPD: И в PHP не страшно тоже

    Как всем известно, в 2011 году указом президента РФ был отменен переход на зимнее время. Тем не менее, 30 октября на многих компьютерах часы были переведены. Мы не будем выяснять почему нужные апдейты не были вовремя скачаны установлены (нерадивость админов или невозможность этой операции). Главное сейчас привести часы в актуальное состояние. Конкретно речь пойдет об ОС FreeBSD. Кого не минула чаша сия — прошу под кат.

    Итак, имеем сервер под управлением FreeBSD, в моем случае версии 7.0. Перво-наперво командой date проверяем текущее время. Если время правильное, можно смело закрыть этот пост и дальше не читать, в противном случае — проблема «на лицо». Для решения инцидента нам нужно обновить часовые пояса и выбрать из них нужный нам.

    Для начала обновим порты, есть несколько способов, какой выбрать решать вам. У меня успешно работает cvsup (однажды добавленный в cron, позволяет иметь всегда актуальную версию портов). Далее идем в /usr/ports/misc/zoneinfo и там выполняем привычные нам make install clean && rehash. Все, теперь у нас есть актуальный список временных зон. Осталось только выбрать правильный часовой пояс и дело в шляпе. Стартуем утилиту tzsetup, и выбираем в списке наш часовой пояс. В моем случае (сервер находится в Новосибирске) это Asia — Russian Federation — Moscow+3 Адепты консоли, конечно, могут это сделать и вручную

    # cp /usr/share/zoneinfo/vash_chasovoy_poyas /etc/localtime
    

    После этого я все же рекомендовал бы перезагрузку сервера целиком, как стало известно из поста dave42 и комментариев к нему, cron и mysql до рестарта продолжат работу с неверным временем, возможно другие демоны поведут себя тоже не лучшим образом. Ну и если возможности ребутить сервер нет, то хотя бы перезапустить сервисы по отдельности. Надеюсь кому-то помог, спасибо за внимание.

    UPD
    Ниже, в комментах, Nastradamus сообщает, что вскрылся еще один факт неверной работы сервисов, а именно PHP (у меня эта штука так же была замечена):

    Nastradamus 1 ноября 2011, 14:57
    Столкнулся с такой штукой в PHP.
    phpinfo():

    date
    date/time support enabled
    «Olson» Timezone Database Version 2010.9
    Timezone Database internal
    Default timezone Europe/Moscow

    PHP модулем к апачу, апач рестартовал.

    Вот думаю как решить проблему — php показывает время на час раньше.
    Наверное, надо пересобрать php.

    Nastradamus 1 ноября 2011, 15:08 # ↑
    Блин, пересборка порта не помогла.
    Призываю всех подумать. Проблема серьезная!
    Речь о FreeBSD и PHP 5.2.17_3

    Nastradamus 1 ноября 2011, 15:21 # ↑
    Полная перезагрузка тестового стенда не помогла!

    Nastradamus 1 ноября 2011, 15:27 # ↑
    Починилось так:
    1) pecl install timezonedb
    2) добавляем в файл /usr/local/etc/php/extensions.ini строку:
    extension=timezonedb.so
    3) рестартуем Апач


    От себя добавлю, если в процессе работы pecl произошла такая ошибка:
    # pecl install timezonedb
    pecl.php.net is using a unsupported protocal - This should never happen.
    install failed

    то нужно сделать следующее:
    # cd `pecl config-get php_dir`
    (небольшой хинт: из под mc конструкция cd `pecl config-get php_dir`
     не отрабатывает, поэтому либо меняем каталог руками, либо выполняем в голой консоли)
    # mv .channels .channels-broken
    # pecl update-channels

    а потом снова повторить
    # pecl install timezonedb

    Скажем спасибо ув. Nastradamus за решение, от меня лучи добра в карму :)
    Share post
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 38

      +1
      Если у кого не вышло обновить zoneinfo. Качайте от сюда tarball и замените порт на содержимое этого архива.

        +1
        А еще не забыть прочитать pkg-descr, в котором написано, что если вы собираете систему из исходников, добавьте MK_ZONEINFO=«no» в ваш /etc/make.conf
          0
          А если не помогло обновление порта:

          cd /tmp
          wget tx-us.lunar-linux.org/lunar/mirrors/tzdata2011k.tar.gz
          tar vzxf tzdata2011k.tar.gz
          zic europe
          ln -sf /usr/share/zoneinfo/Europe/Moscow /etc/localtime
          date
            0
            Перед командой:
            >>ln -sf /usr/share/zoneinfo/Europe/Moscow /etc/localtime

            может потребоваться:
            # rm /etc/localtime

            мне потребовалось сегодня.
            0
            Не сочтите за занудство, но почему не
            ln -s /usr/share/zoneinfo/Europe/Moscow /etc/localtime
            вместо копи?
              0
              это на тот случай если /usr на другом разделе и раздел неожиданно отвалился.
                +4
                Если отвалится /usr, у вас будут проблемы посерьезнее отсутствия таймзоны :)
                0
                Для этой цели (симлинк) и есть штатная команда
                zic -l /usr/share/zoneinfo/Europe/Moscow
                +5
                Да бросьте вы уже глупостями заниматься, т.е. cvsup. Если мне не изменяет память где-то с версии 6.2 есть csup встроенный, который делает то же самое, но не тянет за собой кучу ненужных зависимостей.
                А если коротко суть поста:
                # csup -L 2 ports-supfile
                # portmaster misc/zoneinfo
                # tzsetup
                # service mysql-server restart
                # service cron restart
                # echo 'MK_ZONEINFO="no"' > /etc/make.conf
                  0
                  С последней командой поосторожнее, ибо забыл один знак :)
                    +1
                    Правильная команда для копипастеров:

                    echo 'MK_ZONEINFO="no"' >> /etc/make.conf


                    Только во фрюхе нет «service» своего. Надо перезапускать через что-то типа /usr/local/etc/rc.d/ и /etc/rc.d/ скрипты.
                      0
                      Относительно недавно открыл для себя эту команду. Правда у меня 8.2. Вычислять в какой версии появилось как-то не очень тянет.
                        0
                        7.3 / 8.1
                          0
                          Похоже на то. У меня как раз 7.2 оказалась.
                        0
                        MK_ZONEINFO=«no» в make.conf нужен только в случае если вы собираетесь собрать мир из сорцов /usr/src, где информация о таймзонах старее чем из порта misc/zoneinfo
                      0
                      Еще, если стоит nginx, его мастеру надо -HUP послать. Я про это вот как раз и забыл :)
                      0
                      Может вместо cvsup и csup использовать portsnap? ;)
                        0
                        На вкус и цвет все фломастеры разные же )
                          0
                          Тоже можно, но там файлки менее свежие. Т.е. на любителя.
                            0
                            Задержка максимум на пару часов — стоит ли геморрой свеч? :)
                              0
                              Я один раз попадал в ситуацию, когда мне нужна была более свежая версия, но через portsnap выкачивалась ещё старая версия. В целом не критично чем пользоваться, оба метода работают без проблем. Ну а если вы за прокси сидите, что portsnap ваш единственный выбор.
                                0
                                Если мне надо cvsup через прокси, то обычно делаю через ssh tunneling.
                                  +1
                                  Да. Как вариант. Только зачем костыли городить, если portsnap справляется?
                                    0
                                    Каждому — своё. По мне так проще скачать только изменения через cvsup, а не тащить весь snapshot через portsnap.
                                      0
                                      Согласен. Я тоже вытягиваю обновления через csup.
                                        0
                                        Весь снапшот тащится только один раз при portsnap fetch extract, в дальнейшем — portsnap fetch update — только изменения
                                          0
                                          Вытягивается весь снапшот, экстракт — его полностью выкладывает, апдейт только то, чего обновлено из снапшота.
                                    0
                                    Ну я как раз не за прокси, поэтому все тащит и так :)
                              0
                              Столкнулся с такой штукой в PHP.
                              phpinfo():

                              date
                              date/time support enabled
                              «Olson» Timezone Database Version 2010.9
                              Timezone Database internal
                              Default timezone Europe/Moscow

                              PHP модулем к апачу, апач рестартовал.

                              Вот думаю как решить проблему — php показывает время на час раньше.
                              Наверное, надо пересобрать php.
                                0
                                Блин, пересборка порта не помогла.
                                Призываю всех подумать. Проблема серьезная!
                                Речь о FreeBSD и PHP 5.2.17_3
                                  0
                                  Полная перезагрузка тестового стенда не помогла!
                                    0
                                    Починилось так:
                                    1) pecl install timezonedb
                                    2) добавляем в файл /usr/local/etc/php/extensions.ini строку:
                                    extension=timezonedb.so
                                    3) рестартуем Апач

                                      0
                                      Спасибо за решение, поднял в пост.
                                        +1
                                        cd /usr/ports/misc/pecl-timezonedb/; make install clean
                                        /usr/local/etc/rc.d/apache22 restart
                                        Тоже самое только без всяких install failed как указал автор в UPD
                                  0
                                  Решил у себя проблему временной зоны на php редактированием конфига php.ini:
                                  [Date]
                                  ; Defines the default timezone used by the date functions
                                  date.timezone = Etc/GMT-4

                                  После коррекции конфига нужен рестарт php. Пересборка не нужна.
                                  0
                                  Блин, вот за что люблю *никсы, так за то, что у каждой (почти) задачи есть масса решений, выбирай какое больше нравится ))
                                    0
                                    1) pecl install timezonedb
                                    2) добавляем в файл /usr/local/etc/php/extensions.ini строку:
                                    extension=timezonedb.so
                                    3) рестартуем Апач


                                    Отработало без проблем. А я голову ломал, почему на сайте дата неправильная.
                                    СПАСИБИЩЕ!
                                      0
                                      Не подскажете — а в джайле как перевести время — на основной машине время по приведенну здесь рецепту перевел, но в джайле время не меняется.
                                      Стоит у меня freebsd 7.2

                                      Only users with full accounts can post comments. Log in, please.