Категории

пятница, 9 декабря 2011 г.

Рекурсивная перекодировка имен файлов и каталогов

Бывает так, что на диске по каким-то причинам файлы и каталоги хранятся не в той кодировке, в которой хотелось бы, sh скрипт, приведенный ниже решает эту проблему.
Чтобы определить из какой кодировки и в какую кодировать можно воспользоваться онлайн сервисом http://www.online-decoder.com/ru или ему подобными.

#!/bin/sh

# Чтобы определить из какой кодировки в какую 
#  кодировать можно воспользоваться онлайн подобным
#  сервисом http://www.online-decoder.com/ru

DIR_PATH='/mnt/volume1/'  # Каталог для обработки
F_CODE='cp1251'    # В какой кодировке хранятся имена файлов
T_CODE='koi8-r'    # В какую кодировку перекодировать имена файлов

# ищем сперва самые "глубокие Директории"
find -d $DIR_PATH -type d | while read dir; do
  if [ -e "$dir" ]; then    # Если такая директория существует, то...
    D_OUT="$(echo "$dir" | iconv -f $F_CODE -t $T_CODE)"
# ВАЖНО Сперва получаем список файлов в самой глубокой директории
#  (ВАЖНО, чтобы она была самой "глубокой")
    ls "$dir" | while read file; do
      F_OUT="$(echo "$file" | iconv -f $F_CODE -t $T_CODE)"
      # Если имена файлов не равны, то переименовываем их
      if [ "$dir" != "$D_OUT" ]; then
        echo "$dir/$file" '->' "$dir/$F_OUT";
        mv "$dir/$file" "$dir/$F_OUT";
      fi
    done
# Если имена каталогов НЕ равны, то можем со
#  спокойной совестью перекодировать каталоги
    if [ "$dir" != "$D_OUT" ]; then
      echo "$dir" '->' "$D_OUT";
      mv "$dir" "$D_OUT";
      echo '------------------------'
    fi
  fi
done

среда, 7 декабря 2011 г.

Экранировка % (процент) и @ (собака) в /etc/crontab

Если задумали использовать в файле /etc/crontab символы "%" и "@", то придется их экранировать символом "\".
Например, если вам нужно, чтобы создавался файл с датой в названии, то строка crontab будет выглядеть следующим образом:
...
* * * * * root touch "/tmp/$(date "+\%Y.\%m.\%d_\%H-\%M-\%S").time"
Спустя минуту получаем:
server# ls /tmp | grep 'time'
2011.12.07_23-47-00.time
А в логах видим, что наша команда корректно выполнялась:
server# tail /var/log/cron | grep /tmp
Dec  7 22:47:00 mail_send /usr/sbin/cron[47606]: (root) CMD (touch "/mnt/e-mail/$(date "+%Y.%m.%d_%H-%M-%S").time")

вторник, 6 декабря 2011 г.

Исправляем проблемы с зимним/летним временем во FreeBSD

Для начала проверяем расписание перевода часов на 2011 год:
server# zdump -v /etc/localtime | grep 2011
/etc/localtime  Sat Mar 26 18:59:59 2011 UTC = Sun Mar 27 01:59:59 2011 KRAT isdst=0 gmtoff=25200
/etc/localtime  Sat Mar 26 19:00:00 2011 UTC = Sun Mar 27 03:00:00 2011 KRAST isdst=1 gmtoff=28800
/etc/localtime  Sat Oct 29 18:59:59 2011 UTC = Sun Oct 30 02:59:59 2011 KRAST isdst=1 gmtoff=28800
/etc/localtime  Sat Oct 29 19:00:00 2011 UTC = Sun Oct 30 02:00:00 2011 KRAT isdst=0 gmtoff=25200
Если видим только первые две строки, команды переводить часы 30 октября отсутствуют, значит, база часовых поясов актуальна.
Но если все-таки у вас 4 строчки, то читаем дальше как обновить базу часовых поясов:
Обновляем порты и устанавливаем порт zoneinfo:
server# portsnap fetch update
server# cd /usr/ports/misc/zoneinfo && make deinstall
server# make install clean
В случае успешной установки, двигаемся дальше.
Можно выбрать часовой пояс с помощью установочного меню (sysinstall -> configure -> Time Zone):
tzsetup
А можно скопировать файл нужного пояса вручную, предварительно зарезервировав старый:
server# mv /etc/localtime /etc/localtime.old
server# cp /usr/share/zoneinfo/Asia/Krasnoyarsk /etc/localtime
Проверяем:
server# zdump -v /etc/localtime | grep 2011
/etc/localtime  Sat Mar 26 18:59:59 2011 UTC = Sun Mar 27 01:59:59 2011 KRAT isdst=0 gmtoff=25200
/etc/localtime  Sat Mar 26 19:00:00 2011 UTC = Sun Mar 27 03:00:00 2011 KRAT isdst=0 gmtoff=28800
Если видим две строки, инструкции переводить часы 30 октября отсутствуют, база обновлена успешно.
Чтобы изменения вступили в силу для всех программ, их нужно будет перезапустить.
Обязательно обновите /etc/localtime в chroot-окружениях и крайне важно не забыть перезапустить демона cron:
server# /etc/rc.d/cron restart
Stopping cron.
Starting cron.
Ссылки:
1. OpenNet: Ручная настройка отмены перехода на зимнее время в Unix-подобных ОС
2. OpenNet: Отмена перехода на зимнее время в PostgreSQL

P.S. Из-за этого "отставания" системных часов, может перестать работать ntp сервер времени. Для исправления этой проблемы, придется проделать следующее:
1. Остановить сервер NTP:
/etc/rc.d/ntpd stop
2. Выполнить обновление базы часовых поясов 3. На всякий случай вручную синхронизировать время командой:
ntpdate 0.ru.pool.ntp.org
4. Теперь можно запустить сервер NTP:
/etc/rc.d/ntpd start

Следует иметь ввиду, что до тех пор, пока в /usr/src содержатся устаревшие данные, то при пересборке мира следует указывать MK_ZONEINFO="no" в файле /etc/make.conf, в противном случае файлы содержащиеся в /usr/share/zoneinfo, установленные из порта /usr/ports/misc/zoneinfo будут заменены содержащимися в дереве исходных кодов, т.е. устревшими.

пятница, 2 декабря 2011 г.

watch в FreeBSD и watch в Linux разные вещи

watch во FreeBSD позволяет наблюдать за происходящим в консоли у других пользователей. Например, в системе есть 2 пользователя user и admin. Admin подключается по ssh, и смотрит кто авторизован с системе:
FreeBSD@admin# w
21:16  up  1:39, 2 users, load averages: 0,00 0,00 0,00
USER             TTY      FROM          LOGIN@   IDLE WHAT
user            pts/0    192.168.4.1    20:22       4 more
admin           pts/2    192.168.4.2    21:08       - w
Видно, что в системе авторизованы 2 пользователя, у user выполняется команда more, а у admin выполняется команда w (who). Если теперь пользователь admin введет команду:
FreeBSD@admin# watch pts/0
Где pts/0 имя терминала, за которым хотим наблюдать. В результате пользователь admin будет видеть все происходящее в консоли пользователя user в режиме реального времени (некое подобие R-admin или TeamViewer, только для консоли), будет видно даже то, как набираются команды пользователем user.
Чтобы выйти из наблюдения нужно нажать комбинацию клавиш Ctrl+G.

watch в Linux - Периодическое выполнение команды.
Пример:
user@user-Ubuntu-11:~$ watch -n 5 df -h
'-n 5' - выполнять команду раз в 5 секунд.
'df -h' - команда, которая будет выполняться.

Если хотите такую же функциональность watch из Linux во FreeBSD, то потребуется установить из портов cmdwatch
FreeBSD@admin# cd /usr/ports/sysutils/cmdwatch
FreeBSD@admin# make install clean && rehash
После чего можно использовать cmdwatch
FreeBSD@admin# cmdwatch -n 5 df -h
Более подробно man watch, man cmdwatch

Для работы данной утилиты потребуется модуль ядра snp.ko, и если этот модуль ядра не будет загружен, то при попытке использования команды w (who) в jail, получите сообщение об ошибке, для решения данной проблемы потребуется прописать автоматическую загрузку данного модуля
FreeBSD# echo 'snp_load="YES"' >> /boot/loader.conf