Рейтинг
0.00

BASH

6 читателей, 31 топик

BASH Tips&Tricks #0007: Организуем "многозадачное" сжатие

  • BASH
К сожалению, утилита xz до сих пор не умеет и уже, как видно, никогда не научится сжимать в несколько потоков (см. соотв комментарий в man-странице). 7z с некоторыми типами алгоритмов, в т.ч. с горячо любимым мной PPM, тоже не умеет распараллеливаться (во всяком случае ключ -mmt не даёт желаемого результата).
Но ведь можно осуществить сжатие нескольких файлов параллельно несколькими процессами! Единственная «хитрость» здесь будет заключаться в том, что для получения определённого гарантированного результата («всё сжалось»), нужно всё-таки подождать, чтобы все процессы завершились к моменту дальнейшей обработки файлов или к моменту, когда скрипт должен завершиться.

Всё это делается примерно в таком стиле:

for f; do
 xz $f &
 pids+=" $!"
done

for pid in $pids; do
 wait $pid
done


Время выполнения последнего цикла будет соответствовать времени выполнения самого «длительного» процесса сжатия, а для тех процессов, которые уже завершатся к моменту, когда до них дойдёт очередь «ожидания», команда wait просто отработает как NOP (no-operation в intel assembler :)).
Заметьте, что между двумя циклами можно вставить практически всё, что угодно, так что одновременно со сжатием можно делать и ещё что-нибудь полезное.

Простой загрузчик таблицы маршрутизации, он же "пример на массивы"

  • BASH
Да, я в курсе, что есть некие другие средства для того, чтобы делать тоже самое.
Тем не менее, есть у меня некое подозрение, что мой скрипт делает это наиболее наглядным, прямолинейным и безопасным способом.
Собственно, он даже и вовсе ничего не меняет, он ведь просто «печатает» команды, которые нужно выполнить для того, чтобы привести текущую таблицу маршрутизации в полное соответствие с сохранённой. Сами команды пишутся на STDOUT, редкие отладочные сообщения — на STDERR.
Читать дальше →

Простая "обёртка" для LVMSync

  • BASH
Написал незамысловатый фронтэнд для замечательной утилиты lvmsync, написанной Matt Shed. Спасибо тебе, Шэд, ты единственный человек, который удосужился разумным (т.е. читай: вменяемым) способом решить вопрос синхронизации блочных устройств. Да, только для LVM-томов. Но причина тому банальна до безобразия: LVM-тома — это пока единственный широко распространённый тип блочных устройств, изменения на которых можно отслеживать при посредстве самого механизма записи, а не выявлять каким-то хитрым образом уже пост-фактум, считывая произвольные куски, скурпулёзно высчитывая контрольные суммы и вообще занимаясь какой-то хиромантией. Есть конечно ddsnap от Zumastor'а, и он нашёл своё широкое применение на хранилищах свалок истории, предлагая патчить ядро Linux для решения «в общем виде» той задачи, которая в принципе такого решения иметь не должна.

Читать дальше →

BASH Tips&Tricks #0006: Как делать точно не следует

  • BASH
Наверное, это будет самый короткий пост в серии Tips&Tricks, потому что…

a="t*"
b="/etc/fs*"
c=/proc/1*

— да, вот именно так делать и не следует.
А именно: астериск (символ "*") в двойных кавычках и в присваивании переменной интерпретируется BASH не так, как вам хочется и даже не так, как хочется разработчикам BASH. Попробуйте и убедитесь сами.
Но лучше сразу экранируйте его, а для получения списка файлов пользуйтесь ls.

Всё!

BASH Tips&Tricks #0005: О том, что остаётся за скобками. За двойными.

  • BASH
BASH, сам по себе весьма мощный интерпретатор команд с очень широкими возможностями (в т.ч. и для написания кода, который не понимает даже его автор сразу после сохранения файла скрипта), становится просто кладезем интересных возможностей тогда, когда вы открываете для себя круглые, но в то же время такие многогранные, — (( двойные+скобки ))!

Дело в том, что выражения, заключенные в круглые двойные скобки, ведут себя так, словно их написали на одном из многочисленных диалектов языка Си (Perl-программисты, цыц, это не про вас!).
Вот, например, как преображаются циклы с использованием этой «super cow power» из мира си-подобных языков:

max_i=12
for ((i=1; i<=max_i; i++)); do
 date -d "2012-$i-01" +%B
done

Выражения, заключенные в «тёплые ладони» двойных круглых скобок помогают избавиться от уродливой конструкции ${} вокруг элементов массива. И вообще как только мы попадаем в чудесный мир Си-подобных кострукций за «двойным ограждением», у нас пропадает всякая необходимость постоянно писать $VAR или уж тем более ${VAR}. Узрите истину!
Читать дальше →

Bash script для обновления данных на бесплатном dnsdynamic.org

  • BASH
Есть отличный ДНС сервис для динамических АйПи. dnsdynamic.org. В больших городах Rоссии это не актуально, а вот мне, как филиппинцу, да еще и не столичному, кроме АДСЛ ничего не светит еще долго… поэтому приходится выкручиваться. На сайте прилагается клиент и настройка…

Ho тут несколько раз не сработал перловый ddclient, и я решил упростить дело и написал на баше, благо API позволяет. может кому и сгодится… юзернэйм и пароль испойзуйте те, с которыми логинетесь на сайт
#!/bin/bash
IP=`/usr/bin/GET https://myip.dnsdynamic.org`
USER="USER@gmail.com"
PASSWD="SECRET"
sleep 10
    for i in `cat /var/scripts/dnsdynamic.org.lst`;
        do /usr/bin/GET -C ${USER}:${PASSWD} https://www.dnsdynamic.org/api/?hostname=$i\&myip=${IP};
        echo "Update domain $i to IP address ${IP}";
        sleep 5;
    done;

добавьте в фаил /var/scripts/dnsdynamic.org.lst свои домены. Каждый домен с новой строки:

echo "asterisk-63.voip01.com" >> dnsdynamic.org.lst
echo "yourdomain.http01.com" >> dnsdynamic.org.lst

но неплохо бы и проверку valid IP производить перед циклом. может кто подскажет?