Многопоточная обработка файлов в Bash

Не знал писать или нет но всё таки решил поделиться. Потребовалось тут по работе запускать параллельную обработку файлов с определяемым количеством потоков. Сначала в интернете нашёл статью Dr.AKULAvich где рассказывалось про ppss (http://drakulavich.blogspot.com/2009/01/ppss.html) но по целому ряду причин эта программа нам не подошла и тогда я просто сам написал простой и во многом примитивный скрипт. Но главное что он работает! Вот делюсь:
Несколько пояснений: никакой универсальностью здесь и не пахнет. Под каждую задачу его надо править ручками. Данный вариант обработает все файлы с расширением dmp в папке /home/user/dir. Обработка сводится к их шифрованию с жатием и последующем удаление исходных файлов. Переменная TH определяет количество потоков.

#!/bin/bash
enc () {
for FILES in `cat $1`
do
gpg -z 9 -e -r my@email.com $FILES && shred -z -u -n 1 -s 1M $FILES
done
}
TH=8
cd /home/user/dir
for i in *.dmp
do
echo $i >> list.txt
done
N=`cat list.txt | wc -l`
let "L = N / TH"
let "RES = N % TH"
if [ $RES != 0 ]; then
     let "L +=1"
else
     echo ""
fi
split -l $L -d list.txt

for NUM in x*
do
enc $NUM &
done

rm list.txt
rm -f x*

Пакетная конвертация видео под Android в консоли.

Думаю, что многие знаю прекрасную программу для конвертации видео од названием HandBrake. Простая, удобная и главное, что без всяких настроек и тюнинга конвертировать видео-файлы в более комфортный для просмотра на Android устройствах. В ней, конечно, есть неточности например дефолтный пресет для Android’а почему то называет “iPhone & iPod Touch” ну да оставим это на совести автора :-D. Главное, что работает.

Вряд ли сама програма потребует каких либо инструкций. Но что делать если захотелось странного? Например не использовать GUI. На самом деле, применений этой странности может быть много. Скажем у вас есть жирный такой сервер который можно и загрузить на пару минут конвертацией свежей серией Хауса в свободное от расчёта траекторий баллистических ракет работы время. Или наоборот у вас старенькая и слабая машина и Gnome с прочими иксами забирают достаточно много ресурсов. Так всё это сделать достаточно легко! В общем виде это будет выглядеть так:

maksim@server:~$ HandBrakeCLI -i input.avi -o output.mp4 --preset "iPhone & iPod Touch"

Параметр «—preset» можно сократить до «-Z».

maksim@server:~$ HandBrakeCLI -i input.avi -o output.mp4 -Z "iPhone & iPod Touch"

Всё хорошо в этих командах кроме одного. А как быть если хочется обработать целую папку? Проблема в том, что в данный момент в программе HandBrakeCLI не существует никакой групповой обработки. на официальном форуме пока, что предлагают использовать скрипты, что мы и сделаем:

#!/bin/bash
if [ -d "$1/mobile" ]
        then
                echo "Folder exists"
        else
                mkdir "$1/mobile"
                echo "DIR CREATE"
fi
cd "$1"
for FILENAME in *.avi
do
        /usr/bin/HandBrakeCLI -i "$1/$FILENAME" -o "$1/mobile/${FILENAME%.*}.mp4" --preset="iPhone & iPod Touch"
done

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

Создание RAID-массива поверх multipath устройств (RHEL5)

Потребовалось тут по работе настроить RAID-1 на основе двух multipath устройств. Задача не совсем тривиальная и памятуя о том сколько времени я провёл в поиске для нахождения проблемы решил вот поделиться. Говорю сразу если какие-то слова из первого предложения вам не понятны дальше лучше не читать :). Толку будет мало. Статья пишется в расчёте на таких же как я сам страдальцев. Вдруг вам повезёт на неё наткнуться :).

Итак у нас есть четыре диска вида /dev/sd[abcd] которые представляют из себя четыре пути до двух реальных устройств. Сервис multipathd соберёт их в два виртуальных устройства (настройка multipathd неплохо документирована в сети и на ней я останавливаться не буду):

[root@server ~]# /sbin/multipath -ll
mpath5 (3600508b400307eb80000b001036f0000) dm-1 HP,HSV200
[size=4.0G][features=1 queue_if_no_path][hwhandler=0][rw]
\_ round-robin 0 [prio=50][active]
\_ 6:0:3:2 sdm 8:192 [active][ready]
\_ round-robin 0 [prio=10][enabled]
\_ 6:0:0:2 sdd 8:48 [active][ready]
mpath4 (3600508b400107eb80000a00003740000) dm-0 HP,HSV200
[size=32G][features=1 queue_if_no_path][hwhandler=0][rw]
\_ round-robin 0 [prio=50][active]
\_ 6:0:0:1 sdc 8:32 [active][ready]
\_ round-robin 0 [prio=10][enabled]
\_ 6:0:3:1 sdl 8:176 [active][ready]

Для начала нам надо на дисках /dev/sd[abcd] создать разделы. Понятно, что можно создать лишь на sda и sdc. Вот тут есть небольшая тонкость несмотря на то что разделы будут использоваться фактически для RAID-1 ставить им тип 0xfd нельзя! Дело в том, что как только системе будут презентованы эти диск md соберёт из них RAID, и вы получите устройство из /dev/sda1 и /dev/sdc1. А нам то нужны multipath элементы. Можно вообще ничего не указывать, можете указать 0×83 в качестве типа. В любом случае это не принципиально. Лишь бы не 0xfd.

Поехали дальше. После того как разделы созданы необходимо для каждого dm устройства выполнить команду:

kpartx -a /dev/dm-n

она создаст устройства вида /dev/dm-n+1, которые и будут являться нашими только что созданными разделами. Их уже можно объединять в RAID. Если по этому процессу есть какие либо вопросы то вот тут есть неплохая статья. Обязательно создаём mdadm.conf. Про него можно так же прочесть по прошлой ссылке.

А вот дальше есть очень и очень интересный момент! Дело в том, что в RHEL 5 (шестой версии под рукой нет и проверить не смогу) есть досадный баг. В файле /etc/rc.sysinit процедура инициализации RAID-разделов с помощью mdadm.conf вызывается до создания всех /dev/mapper/ устройств. А наши /dev/dm-* на самом деле лишь их отражение. В итоге RAID собран не будет. Есть два решения этой проблемы:

  1. Создать в /etc/init.d/ скрипт по сути из одной строчки
    /sbin/mdadm --assemble /dev/md0

    и обеспечить ему загрузку на нужном runlevel. Он может быть любым по порядку загрузки. Главное чтобы после sysinit’а.

  2. Переместить в файле /etc/rc.sysinit блок
    # RAID setup
    update_boot_stage RCraid
    [ -x /sbin/nash ] && echo "raidautorun /dev/md0" | nash --quiet
    if [ -f /etc/mdadm.conf ]; then
        /sbin/mdadm -A -s
    fi

    ниже блока инициализации # Device mapper & related initialization. Он достаточно длинный и поэтому приводить я его тут не буду.

Первый бонус от Foursquare

Если честно никогда не мог ответить даже самому себе, а зачем я использую Foursquare. В России бонусов мэрам мягко скажем немного, там где они есть я сам обычно не появляюсь. В общем, это было ближе к банальной игре в царя горы и какой-то уже привычки что-ли. Но вот сегодня случилось странное. Внезапно получил бонус мэру. Дело было так :)…

В банке ВТБ 24 у меня достаточно давно заведено две карточки ну и достаточно активно пользуюсь их Телебанком. За всё время использования каких либо нареканий к банку придумать не могу но вот недавно надобность в одной из карточек отпала. Надо её закрыть. А так как вспомнил я об этом аккурат посреди праздников то и полез к ним на сайт узнать как же ближайшее отделение работает. Быстро узнал, что нужно но при этом зацепился взглядом за новость о вручении мэрам их дополнительных офисов призов/сувениров. А в том офисе, что буквально под окнами дома я мэр уже больше чем полгода. Ну и особо ни на что не надеясь я сообщил об этом в банк.

Сегодня же утром мне упало письмо с вопросом куда высылать курьера. Как итог брэндированная флэшка на 1 Гб и блокнот :)

OpenOffice Document Reader

Никто не сомневается, наверное, что через каких нибудь жалких лет пять или десять мы почти целиком переползём в веб. Оставляя на десктопах только что-то по настоящему тяжёлое и ресурсоёмкое. Но до этого дня ещё далеко и пока что, как не крути, мы живём в мире файлов и документов, а не share-ссылок. И форматов хранения этих документов великое множество. Достаточно популярным является Open Office. Кто-то использует его в силу привычки, кто-то просто не хочет воровать, у кого-то это корпоративный стандарт. У меня, например почти вся написанная мной документация лежит как в вебе (само собой) так и на рабочем компьютере. Как раз таки в том самом odt формате.

К чему я это всё? Просто, мне лично хочется иметь возможность хотя бы просматривать все необходимые мне форматы на телефоне. И вот сегодня утром я наткунлся на OpenOffice Documet Reader. Насколько я знаю, первую программу под Andoird, что может открывать на просмотр odt-документы. Насколько я понял функцию редактирования автор добавлять не собирается но я лично рад и возможности читать нужные мне файлы пусть и без правки в дороге.

Белоруссия

Вот уж чего точно никогда не делал так это не писал о политике. Но примерно час наблюдения за твиттером по хэш-тэгу #electby меня окончательно поставил в тупик. Ну масса шуток и приколов на тему Лукашенко, площади этой и ещё чёрт знает чего это понятно. Крики с просьбами поддержать митингующих как бы то же вопросов не вызывают. Но вот сожаление где то в час ночи на тему “ах же ж блин у нас ничего не получилось” меня озадачило. Очень хочется спросить у белорусов, а чего вы хотели добиться на этой площади? Если сбросить “диктатора” то митинг штука глупая изначально. Ну давайте просто вспомним хотя бы одного диктатора из истории кто в ответ на вопли толпы посыпал голову пеплом, вышел к народу и покаялся. Таких не бывает. Вывод? Если он диктатор то вам нужен не митинг, а бунт или революция. Тут очень хорошо процитировать один твитт из того потока, что заливал весь интернет на протяжение нескольких часов.

почему нынче необязательно брать с собой оружие, собираясь на бунт? ответьте #electby !!!

Ну правда как то странно. Или была надежда, что ОМОН и армия в раз расчувствуются и скандируя “ELECTBY!” перейдут на сторону митингующих? Так это бред же.

Ну а если он президент, а не диктатор то тем более чего же вы хотели? На площади собралась огромная толпа, что-то там выкрикивает, лезет в здания гос.учреждений и вообще ведёт себя опасно (пусть даже это и была провокация, хотя ИМХО она и не нужен. При таком скопление народа кто нибудь да полезет на амбразуры на парах алкоголя) . Конечно её надо разогнать. И вообще — хотели высказать? Высказались? Всем спасибо, все свободны, а завтра ещё и на работу вставать так, что срочно домой и спать.

Я не за “Батьку”, я вообще гражданин другой страны и не мне судить этих людей, я просто пытаюсь понять, а чего же они пытались добиться? И не понимаю.

З.Ы. Отдельного упоминания стоит некая “твиттер-революция” которая по мнение многих митингующих внезапно(!) случилась на площади в Минске. Ребята вы о чём? По разным данным там собралось от трёх до ста(!!) тысяч человек. Из них про твиттер то слышало дай бог процентов пять. Единственное, что показали эти события (равно как и Манежка) так это то что твиттер неплохой, быть может даже единственный реальный источник информации при подобных событиях.

 

Сохранение $PATH в окружении sudo -s

Изо дня в день я сталкивался на работе с одной и той же проблемой. Если вы зашли через ssh на некий сервера под своим пользователем, а потом дали команду sudo -s (то, что это единственно нормальный способ логинится рутом на удаленную машину пояснять не надо? :) то скорее всего вы оказались в консоли без вашей привычной переменной PATH. И следовательно даже простой ifconfig превращается в /sbin/ifconfig, ну или в начале каждой сессии набирать:

export PATH=$PATH:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin

Меня лично это в конец достало и я, немного погуглив, нашёл решение. Да, оно очень простое и лежит на поверхности но как показывает практика именно простые вещи чаще всего дольше всех остаются загадками.

Итак всё, что нам нужно это слегка настроить sudo. Набираем visudo и ищем там строчку подобную этой:

Defaults    env_keep = "COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR \
                        LS_COLORS MAIL PS1 PS2 QTDIR USERNAME \
                        LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATION \
                        LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC \
                        LC_PAPER LC_TELEPHONE LC_TIME LC_ALL LANGUAGE LINGUAS \
                        _XKB_CHARSET XAUTHORITY"

Собственно говоря это список тех переменных которые проходят через sudo. Как можно сразу заметить PATH среди них нет. Добавляем её и… а собственно всё :). Наслаждаемся консолью с привычным окружением.

З.Ы. Ещё раз подчёркиваю, я понимаю, что это всё очень просто. Если вы знали про это раньше или просто не сталкивались с подобной проблемой, то я могу только порадоваться за вас. Заметка посвящается страдальцам типа меня :).

Zayka

Четвёртого числа посетил «Клинок» на который, если честно, не ходил уже довольно давно. В целом сходил очень позитивно. Пообщался с людьми которых не видел чёрт знает сколько, посмотрел, что в ножевом мире делается.

В целом то куда движется «Клинок» мне совсем не нравится. Один тот факт, что почти полностью исчезли складные ножи уже как то неприятно. Фактически остались Шокуров с Широгоровыми (соответственно цена от 6000 и выше) и китайщина а-ля Pirat и Viking Norway, что тоже не совсем то. Ну да ладно, я на подобные выставки уже достаточно давно хожу в основном с целью с народом пообщаться. Но всё таки с собой были деньги (да-да я знаю, что это большая ошибка :)) и без приобретения я оттуда не ушёл.

Про то, что керамические ножи существуют знают уже наверное все. Как-то традиционно считалось, что место им на кухне в основном из-за повышенной хрупкости да ломкости. А тут попались на глаза складные ножи категории EDC из всё той же веселой беленькой керамики за совсем не страшную цену. Ну не удержался и таки купил. В основном чтобы просто проверить как подобные клинки будут себя вести именно в ключе EDC. Ну и до кучи очень умилило название брэнда — Zayka. Вроде как правильно читается как Зэйка но удержаться от зайки практически невозможно :).

Ощущение игрушки в руке из-за веса и цвета клинка практически невозможно победить до тех пор пока не попробуешь его в деле. Режет весьма и весьма неплохо. Посмотрим как скажется пресловутая повышенная хрупкость.

Ниже небольшая фото-галерея приобретения. Если есть вопросы — задавайте, попробую ответить.

З.Ы. Нашёл ссылку на сайт изготовителя.

Полезная команда ssh-copy-id

Что может быть более тривиально для админа чем авторизация в ssh-сесиях по RSA ключам? Уверен, что все (ну кто имеет к подобному отношение) много раз настраивали подобную штуку. Как обычно это выглядит? Надо создать пару ключей с помощью ssh-keygen и затем с помощью ftp или scp скопировть открытый ключ на удаленную машину где командой типа cat id_rsa.pub>>authorized_keys добавить ключик к пользовательским. Всё просто. Я сам так делал, все мануалы в инете и в книгах описывают именно этот путь.
Но на курсах я внезапно :) узнал, что оказывается есть более простой и тривиальный путь выполнения данной опперации. Одной командой.

ssh-copy-id -i .ssh/id_rsa.pub server

Эта программа и скопирует, и пропишет открытый ключ сама. Надеюсь, что все кроме меня это знали и пишу эту заметку для таких же тёмных как я :)

Кстати маленький опрос. А вы про эту команду знали?