вторник, 27 мая 2008 г.

Поиск файла по его временным атрибутам

Утилита find позволяет находить файлы по их временным атрибутам, таким как время создания, изменения или последнего доступа. Более того, можно комбинировать их или задавать временные интервалы для более точного поиска.

Например

  • Найти все папки измененные с конца обеда вчерашнего дня
    # find . -newerct 'yesterday 14:00' -and type d -print
  • Найти и удалить все файлы старше двух недель
    # find . -not -newerBt '2 week ago' -and -type f -unlink
  • Нужно найти все файлы, которые были созданы с трех часов ночи позавчерашнего до обеда вчерашнего дня
    # find . -newerBt '2 day ago 03:00' -and -not -newerBt 'yesterday 13:00' -and -type f -print

Список ключей, ответственных за фильтрацию по временным атрибутам

-Bmin n
Истина если разница между временем создания файла и временем начала поиска, округленная до минуты в большую сторону, составляет n минут.

-Bnewer file
Смотрите описание -newerBm.

-Btime n[smhdw]
Если не определены никакие единицы времени, этот ключ вычисляется как истина если разница между временем создания файла и временем начала поиска, округленная до 24-часового периода в большую сторону, составляет n 24-часовых периодов.
Если определены единицы времени, этот ключ вычисляется как истина если разница между временем последнего изменения информации о файле и временем начала поиска составляет n единиц времени. Пожалуйста обратитесь к описанию ключа -atime для получения информации о поддерживаемых единицах времени.

-amin n
Истина если разница между временем последнего доступа к файлу и временем начала поиска, округленная до минуты в большую сторону, составляет n минут.

-anewer file
Смотрите описание -neweram.

-atime n[smhdw]
Если не определены никакие единицы времени, этот ключ вычисляется как истина если разница между временем последнего доступа к файлу и временем начала поиска, округленная до 24-часового периода в большую сторону, составляет n 24-часовых периодов.
Если определены единицы времени, этот ключ вычисляется как истина если разница между временем последнего доступа к файлу и временем начала поиска составляет точно n единиц времени. Возможные единицы времени:
  • s секунда
  • m минута (60 секунд)
  • h час (60 минут)
  • d день (24 часов)
  • w неделя (7 дней)
В аргументе ключа единицы времени можно комбинировать в произвольном порядке. Для примера «-atime -1h30m». Единицы времени используются только совместно с модификаторами «+» или «-».

-cmin n
Истина если разница между временем последнего изменения информации о файле и временем начала поиска, округленная до минуты в большую сторону, составляет n минут.

-cnewer file
Смотрите описание -newercm.

-ctime n[smhdw]
Если не определены никакие единицы времени, этот ключ вычисляется как истина если разница между временем последнего изменения информации о файле и временем начала поиска, округленная до 24-часового периода в большую сторону, составляет n 24-часовых периодов.
Если определены единицы времени, этот ключ вычисляется как истина если разница между временем последнего изменения информации о файле и временем начала поиска составляет n единиц времени. Пожалуйста обратитесь к описанию ключа -atime для получения информации о поддерживаемых единицах времени.

-mmin n
Истина если разница между временем последнего изменения файла и временем начала поиска, округленная до минуты в большую сторону, составляет n минут.

-mtime n[smhdw]
Если не определены никакие единицы времени, этот ключ вычисляется как истина если разница между временем последнего изменения файла и временем начала поиска, округленная до 24-часового периода в большую сторону, составляет n 24-часовых периодов.
Если определены единицы времени, этот ключ вычисляется как истина если разница между временем последнего изменения файла и временем начала поиска составляет n единиц времени. Пожалуйста обратитесь к описанию ключа -atime для получения информации о поддерживаемых единицах времени.

-newer file
-mnewer file
Истина если у текущего файла более позднее время изменения чем у указанного файла.

-newerXY file
Истина если у текущего файла более позднее время доступа (X=a), время создания (X=B) или время изменения (X=m) чем время доступа (Y=a), время создания (Y=B) или время изменения (Y=m) указанного файла (file). В дополнение, если Y=t то file трактуется как время, заданное в одном из описанных в cvs(1) форматов. Отметьте, что -newermm эквивалентен -newer.
Выдержка из man для cvs(1)
Поддерживается множество вариантов форматов для описания даты, в частности ISO и Интернет. В случае, если временная зона в дате не указана явным образом, она трактуется в местной временной зоне. Примеры допустимых форматов:
  • 1 month ago
  • 2 hours ago
  • 400000 seconds ago
  • last year
  • last Monday
  • yesterday
  • a fortnight ago
  • 3/31/92 10:00:07 PST
  • January 23, 1987 10:05pm
  • 22:00 GMT
P.S. Если у вас есть замечания по тексту статьи или дополнения - пожалуйста отпишитесь в комментариях.

среда, 14 мая 2008 г.

Создание программного RAID1 (FreeBSD)

На деле все оказывается очень просто. Втыкаем в сервер второй винчестер с аналогичной емкостью и запускаем систему. Условимся, что ad0 это системный диск, а ad2 - новый.
Далее от имени суперпользователя:

  1. Создаем зеркалируемый RAID массив
    # gmirror label -v -b round-robin gm0 /dev/ad0
    Здесь gmirror label создает зеркалируемый массив; -v включает подробный вывод; -b round-robin задает тип балансировки; gm0 - имя создаваемого массива. В случае, если выдаст ошибку
    Can't store metadata on /dev/ad0: Operation not permitted
    требуется выполнить
    # sysctl kern.geom.debugflags=16
    и снова попытаться создать массив.
  2. Теперь отредактируем файл /boot/loader.conf и разрешим загрузку нужного нам модуля GEOM при старте системы
    # echo 'geom_mirror_load="YES"' >> /boot/loader.conf
  3. Отредактируем записи в /etc/fstab, иначе после ребута система не сможет найти созданный нами дисковый массив и продолжить загрузку. Меняем ad0 на mirror/gm0.
    Было
    /dev/ad0s1b             none            swap    sw              0       0
    /dev/ad0s1a / ufs rw 1 1
    /dev/ad0s1e /tmp ufs rw,nosuid 2 2
    /dev/ad0s1f /usr ufs rw 2 2
    /dev/ad0s1d /var ufs rw,nosuid 2 2
    Стало
    /dev/mirror/gm0s1b              none            swap    sw              0       0
    /dev/mirror/gm0s1a / ufs rw 1 1
    /dev/mirror/gm0s1e /tmp ufs rw,nosuid 2 2
    /dev/mirror/gm0s1f /usr ufs rw 2 2
    /dev/mirror/gm0s1d /var ufs rw,nosuid 2 2
  4. Рестартуем
    # shutdown -r now
  5. После ребута система при старте выведет такие строки
    GEOM_MIRROR: Device gm0 created (id=877665149).
    GEOM_MIRROR: Device gm0: provider ad0 detected.
    GEOM_MIRROR: Device gm0: provider ad0 activated.
    GEOM_MIRROR: Device gm0: provider mirror/gm0 launched.
    GEOM_MIRROR: Device gm0 already configured.
    Mounting root from ufs:/dev/mirror/gm0s1a
  6. Добавим второй диск в массив
    # gmirror insert gm0 /dev/ad2
    GEOM_MIRROR: Device gm0: provider ad2 detected.
    GEOM_MIRROR: Device gm0: rebuilding provider ad2.
    Смотрим на состояние массива
    # gmirror list | more
    Geom name: gm0
    State: DEGRADED
    Components: 2
    Balance: round-robin
    Slice: 4096
    Flags: NONE
    GenID: 0
    SyncID: 1
    ID: 877665149
    Providers:
    1. Name: mirror/gm0
    Mediasize: 40019581952 (37G)
    Sectorsize: 512
    Mode: r6w5e2
    Consumers:
    1. Name: ad0
    Mediasize: 40019581952 (37G)
    Sectorsize: 512
    Mode: r1w1e1
    State: ACTIVE
    Priority: 0
    Flags: DIRTY
    GenID: 0
    SyncID: 1
    ID: 3986018406
    2. Name: ad2
    Mediasize: 41110142976 (38G)
    Sectorsize: 512
    Mode: r1w1e1
    State: SYNCHRONIZING
    Priority: 0
    Flags: DIRTY, SYNCHRONIZING
    GenID: 0
    SyncID: 1
    Synchronized: 1%
    ID: 1946262342
    Массив перешел в критическое состояние и начал синхронизацию данных.
    Посмотреть на текущий статус массива можно так
    # gmirror status
    Name Status Components
    mirror/gm0 DEGRADED ad0
    ad2 (17%)
    где в скобках указан процент синхронизированных данных.
    После окончания синхронизации данных dmesg выведет
    GEOM_MIRROR: Device gm0: rebuilding provider ad2 finished.
    GEOM_MIRROR: Device gm0: provider ad2 activated.
    и статус массива поменяется на рабочий
    # gmirror status
    Name Status Components
    mirror/gm0 COMPLETE ad0
    ad2

четверг, 8 мая 2008 г.

Обновление PHP5

Продолжаю исправлять свои давние ошибки :) На этот раз обновление php5 и его расширений там, где затерлась системная БД с записями об установленных из портов программах.

  1. Соберем php5.
    cd /usr/ports/lang/php5 && make all
    Остановим apache2
    /usr/local/etc/rc.d/apache2 stop
    Ставим php5
    make install
  2. Теперь установим расширения php5.
    Список расширений находится в файле /usr/local/etc/php/extensions.ini. Остается лишь поиск в портах и установка. Для этой цели написал маленький скрипт.
    #!/bin/sh
    grep -oE '=[a-z]+' /usr/local/etc/php/extensions.ini | \
    sed -E 's/^./php5-/' | \
    while read pkg;
    do {
    cd /usr/ports;
    cd `make quicksearch name="^$pkg-" | \
    grep -oE '/usr/ports/.+$'` && make install;
    } done;
    Сохраняем его под именем php5-ext-inst.sh и делаем исполняемым
    chmod +x php5-ext-inst.sh
    Выполняем скрипт.
  3. После установки расширений запускаем apache2 и радуемся жизни :)
    /usr/local/etc/rc.d/apache2 start

пятница, 2 мая 2008 г.

Клоунада (третий сезон)

Некрофилы снова накачали труп SCO деньгами и оживили его. Он уже изрыгает свои первые, после воскрешения, угрозы. Все срочно запасаемся напитками и чипсами. :)