?

Log in

скрипты на все случаи жизни's Journal
 
[Most Recent Entries] [Calendar View] [Friends]

Below are the 20 most recent journal entries recorded in скрипты на все случаи жизни's LiveJournal:

[ << Previous 20 ]
Saturday, July 9th, 2011
4:20 am
[grohman]
mysqldump в несколько гигабайт
Недавно мне пришлось восстанавливать из бекапа дамп mysql-базы размером в пару гигов. Оставив mysql -p --database xxx < dump.sql на ночь я был чертовски огорчен на следующий день, поскольку
1) восстановление из дампа не было закончено;
2) не было понятно в каком именно месте оно затупило.
Было решено разбить дамп на кучу файлов по одной таблице на файл, а их в свою очередь (если они всё равно получаются слишком большие) разбить на кучу файлов по одному insert на файл (mysqldump, которым делался бекап, пишет ограниченное количество данных на один инсерт).
Погуглив и успешно выполнив эту задачу, на всякий случай опишу используемые инструменты под катом.
Read more...Collapse )
Saturday, March 12th, 2011
12:43 am
[vatolkin]
bash скрипты для ftp
Встала передо мной задача - нужно было собранные бэкапы заливать на удаленный сервер, попутно удаляя с него лишние бэкапы.

Возможно кому-нибудь ещё пригодятся эти скрипты, так что далее с небольшими комментариями:

Первый скрипт находит список подпапок в директории (в моём случае /backup), и из каждой из них копирует последний бєкап на удаленный сервер. При этом на удаленном сервере всё складывается в одну директорию.
#!/bin/sh
for user in `/bin/ls /backup/`
do
/usr/bin/ftp -u ftp://login:password@backup.example.com/last/`/bin/date +%Y-%m-%d`-$user.tar.gz /backup/$user/*-`/bin/date +%Y-%m-%d`.tar.gz
done


Второй - удаляет файлы с фтп. Нет погодите, так было бы слишком просто, второй скрипт будет только листинг директории фтп брать. Кстати, его автор - не я. Он был найден в уже готовом виде:
# cat /root/ftplist.sh
#!/bin/sh
hostname="ftp://$1:$2@$3/"
ftp $hostname << EOF
cd last
ls -1R
EOF


Третий - запускает второй скрипт с нужными параметрами, и фильтрует вывод. В результате остаётся только список файлов подлежащих удалению (т.е. все файлы, кроме содержащих сегодняшнюю дату):
# cat /root/ftplistold.sh
#!/bin/sh
/root/ftplist.sh login password backup.example.com | /usr/bin/grep '^-' | /usr/bin/awk '{print $9}' | /usr/bin/grep -v `/bin/date +%Y-%m-%d`


Ну и наконец четвертый скрипт - будет у третьего получать список файлов для удаления, и непосредственно удалять на фтп-сервере:
#!/bin/sh
echo open backup.example.com > /tmp/ftpbackuplist
echo user login password >> /tmp/ftpbackuplist
echo cd last >> /tmp/ftpbackuplist
for a in `/root/ftplistold.sh`
do
echo "delete /last/"$a >> /tmp/ftpbackuplist
done
FTPCMDS=`/bin/cat /tmp/ftpbackuplist`
/bin/rm /tmp/ftpbackuplist
/usr/bin/ftp -inv << EOF
$FTPCMDS
EOF


Вот собственно и всё. Если запускать чистилку до полуночи - а копировалку после, то на резервном сервере будет лежать 2 комплекта бэкапов. Если оба скрипта запускать после полуночи - то только один комплект.
Friday, December 10th, 2010
2:46 pm
[9112]
обработчик кнопки вкл/выкл wifi
столкнулся с задачей подвязать на имеющемся asus eeepc s101h кнопку включения выключения wifi. в первую очередь была цель эргономики - приходя домой с работы и из дома на работу, каждый раз не рестартить wlan0 дабы изменить точку доступа. найденные примеры в интернете мне не особо понравились а некоторые попросту отказывались рабоать, и поэтому вчера вечером решил все-таки сам написать простенький скрипт. он вызывается acpid при появлении события на указанного в default.sh. скрипт полностью логирует все действия. для своей работы использует дополнительный файл, местом хранения которого было выбрано /var/run/
скрипт полностью комментирован, по сему под себя переделать будет элементарно. так же желающие смог легко выкинуть ненужные логи.

#!/bin/sh
#скрипт выполняет действия по нажатию кнопки вкл/выкл wifi адаптера, а так же ведет логи в /var/log/wifi.log.
#скрипт использует файл /var/run/wifi.pid
#в /etc/acpi/default.sh нужно указать, что по событию выполняем /etc/init.d/wifi toggle. тоесть данный скрипт, который в /etc/init.d/ и положите, назвав его wifi.
wifi_on() {
/etc/init.d/net.wlan0 start
}
wifi_off() {
/etc/init.d/net.wlan0 stop
}
case $1 in
start)
wifi_on
;;
stop)
wifi_off
;;
toggle)
sleep 2;
echo `date +%d/%m/%Y" "%H:%M:%S`" status pid: "`cat /var/run/wifi.pid`";">> /var/log/wifi.log;
STAT=`cat /var/run/wifi.pid`
#проверяем статус wifi
if [ "$STAT" = "1" ];
#если wifi включен. выключаем его. все сопровождаем логами.
then
{
echo `date +%d/%m/%Y" "%H:%M:%S`" wifi switching_off (status pid: "`cat /var/run/wifi.pid`");">> /var/log/wifi.log;
wifi_off;
echo "0" > /var/run/wifi.pid
echo `date +%d/%m/%Y" "%H:%M:%S`" wifi is off (status pid: "`cat /var/run/wifi.pid`");">> /var/log/wifi.log;
}
#если выключен. проверяем состояние адаптера. если он выключен(состояние не равно 1), говорим что делать так не хорошо. изменений не производим.
else
{
sleep 3;
if [ `cat /sys/class/rfkill/rfkill0/state` != "1" ];
then
{
echo `date +%d/%m/%Y" "%H:%M:%S`" wifi hardware is down - wifi is not swinching_on (status pid: "`cat /var/run/wifi.pid`");">> /var/log/wifi.log;
echo `date +%d/%m/%Y" "%H:%M:%S`" wifi is off (status pid: "`cat /var/run/wifi.pid`");">> /var/log/wifi.log;
}
#а коли адаптер включен, включаем wifi в системе.
else
{
echo `date +%d/%m/%Y" "%H:%M:%S`" wifi switching_on (status pid: "`cat /var/run/wifi.pid`");">> /var/log/wifi.log;
wifi_on;
echo "1" > /var/run/wifi.pid
sleep 3;
#проверяем, если при включении wifi в системе, произошел сбой - ругаемся об этом в лог, и пишем в pid что все-таки wifi is off =) если без сбоев - говорим, что все хорошо.
if [ `cat /sys/class/rfkill/rfkill0/state` != "1" ];
then
{
echo `date +%d/%m/%Y" "%H:%M:%S`" wifi switching_on ERROR! please look other logs! (status pid: "`cat /var/run/wifi.pid`");">> /var/log/wifi.log;
echo "0" > /var/run/wifi.pid;
echo `date +%d/%m/%Y" "%H:%M:%S`" wifi is off (status pid: "`cat /var/run/wifi.pid`");">> /var/log/wifi.log;
}
else
echo `date +%d/%m/%Y" "%H:%M:%S`" wifi is on (status pid: "`cat /var/run/wifi.pid`");">> /var/log/wifi.log;
fi
}
fi
}
fi
;;
esac
#сразу оговорюсь - в скрипте допущена возможность такой ситуации, что вы включили адаптер, wifi, но точку он не нашел, и через некоторое время статус адаптера вывалится в "0", или если адаптер включен, а wifi оказался выключен, и скрипт при последующем запуске будет думать что у нас все плохо, адаптер выключен, а мы нагло пытаемся включить wifi(ибо статус у адаптера будет значится "0"). все не так :) поскольку сей скрипт завязан на кнопку вкл/выкл адаптера, статусы вместе с этим будут меняться на нужные нам, и вышеописанной ситуации у вас не возникнет :) ну или по крайней мере не должно возникнуть :D


с радостью приму интересные мысли для поправки/доработки сего мелкого но полезного изделия =)
Tuesday, November 23rd, 2010
4:49 am
[grohman]
Домашняя система наблюдения
Через некоторое время я собираюсь уехать из города на несколько дней. Поскольку в моей квартире никого не останется, я решил оставить работающим что-нибудь, что высылало бы мне письма в случае, если в квартиру кто-то зашел. Причем с фотографией того, кто зашел ко мне в дом. Заморачиваться с motion нехотелось, да и освещение у меня тут все в течение дня меняется, так что я написал небольшой bash-скрипт, который решил всю проблему сразу. Итак, нам потребуются: веб-камера, беспроводная мышка и bash.
Read more...Collapse )
Friday, October 15th, 2010
10:32 am
[vatolkin]
Нашел свой старый скрипт для поиска больших директорий.  Принцип действия предельно прост - есть файл /root/list.txt, в котором находится список директорий, которые скрипт ещё не проанализировал. Каждый раз скрипт читает последнюю строчку файла, получает список вложенных директорий для этого каталога, определяет, не превышает ли  самый большой из них предельное значение ALERTSIZE, и в одном случае - дописывает вложенные директории в конец списка /root/list.txt, в другом - отписывается о найденной "REALY BIG DIR" (на экран+пауза 5 сек, и в файл BIGDIRLOG). При этом размер директории определяется не заходя в неё - как обычного файла.

Почему не использовать стандартный find для поиска директории?
find / -type d -size +50k

Ответ прост - мы ищем "REALY BIG DIR", и если find войдет в неё - сервер может банально подвиснуть, либо же очень сильно нагрузить дисковую систему. Кроме этого данный скрипт при перезапуске продолжает свою работу, а не начинает с нуля как find. Ну и конечно-же он в отличии от файнда рисует очень красивый бегущий вверх текст, с директориями в которых только что побывал. Для любителей собирать программы из консоли думаю будет приятно :)

#!/bin/sh
LIST=/root/list.txt
LIST2=/root/list2.txt
BIGDIRLOG=/root/bigdir.txt
ALERTSIZE=40000
if [ -z $1 ]
then
else
echo $1 >> $LIST;
fi
while [ `wc -l $LIST | awk '{print $1}'` != 0 ]
do
CUR=`tail -n 1 list.txt`
# список поддиректорий
PODDIR=`ls -lF $CUR | grep "^d" | awk '{print $9}'`
# количество поддиректорий
CPODDIR=`echo $PODDIR | wc -w | awk '{print $1}'`
# удаляем последнюю строку
cat $LIST | sed '$d' >> $LIST2 ; mv $LIST2 $LIST
if [ $CPODDIR -ne 0 ]
then
for i in $PODDIR
do
echo $CUR$i >> list.txt
done
# размер самой большой диры в каталоге
MOST=`ls -l $CUR | grep "^d" | awk '{print $5 " " $9}' | sort -rn | head -n 1`
MOSTNAME=`echo $MOST | awk '{print $2}'`
MOSTSIZE=`echo $MOST | awk '{print $1}'`
if [ $MOSTSIZE -gt $ALERTSIZE ]
then
echo " * * * REALLY BIG DIR * * *" $CUR$MOSTNAME $MOSTSIZE
echo $CUR$MOSTNAME $MOSTSIZE >> $BIGDIRLOG
# удаляем большую диру из списка
cat $LIST | grep -v $CUR$MOSTNAME >> $LIST2 ; mv $LIST2 $LIST
sleep 5
else
echo $CUR $CPODDIR
fi
else
echo $CUR "<-zero"
fi
# задержка для снижения загрузки на сервер
# 1 секунда - слишком долго, а меньше пока не получается :(
# sleep 1
done

Запускается скрипт тривиально - создаём файл со списком (по умолчанию указан /root/list.txt), и добавляем в него одну или несколько директорий, которые нужно рекурсивно обойти при поиске. После этого скрипт можно запускать без каких-либо параметров :)
Tuesday, June 8th, 2010
12:41 am
[dyff]
Есть конфиг
DIR="/home/user\
/home/user/.AAA BBB"
как обработать это в цикле чтобы путь не разваливался по пробелам?
Friday, January 22nd, 2010
4:00 am
[grohman]
Рекурсивный diff
Чтобы не забыть :)
diff -u -r -B -N -s FOLDER1 FOLDER2
Friday, December 18th, 2009
2:05 pm
[grohman]
Посчитать самые частые слова
Возникла задача посчитать слова в большом текстовом файле и сделать по ним топ-листинг. Сами слова разделены пробелами и знаками препинания - короче говоря, обычный текст.
Вывод топ-20 самых популярных русских и английских слов в файле words.txt длинной более 4 символов делается командой


Read more...Collapse )
Friday, December 11th, 2009
7:45 pm
[grohman]
Парсинг веб-страницы
Мне понадобилось слить к себе в оффлайн сайт, чтобы в этом самом жутком оффлайне я мог бы его читать. А поскольку читать я люблю со смартфона, нужно было почистить скачанные файлы от всяких html и прочих штуковин. За основу я взял парсер с php.net, немного подправленный за некоторое время использования.

Read more...Collapse )
6:56 pm
[grohman]
Рекурсивная смена кодировки
Пишу сюда просто примера ради.
find . -type f -exec sh -c "cat '{}' | iconv -f cp1251 -t utf8 -o '{}'" \;

Эта строка рекурсивно сменит кодировку во всех файлах в текущей директории с виндовой на utf8.
Saturday, October 31st, 2009
6:49 pm
[grohman]
Мониторинг hdd
 Захотелось красивого мониторинга за температурой и нагрузкой hdd на домашнем хосте. Короче говоря, кое-как получилось. Для работы нам потребуются Read more...Collapse )

Read more...Collapse )мне не очень понятно как бы выдергивать строки из iotop без использования файлов. Пробовал по-всякому, фигня получается. Помогите, пожалуйста, с ним разобраться.
update: вроде все сделано :) Спасибо 1_ananas_1 за участие.
update1: теперь захотелось вести логи. Но поскольку писать логи про хдд на хдд мне показалось не очень уместным, я решил писать их в оперативную память. А точнее, в tmpfs. Храниться они там будут, само собой, только до размонтирования ${tmpfs}.
Wednesday, September 9th, 2009
3:22 pm
[am_kalinin]
Поиск совпадений в тексте
Есть текстовый файл - электронная книга.
Есть желание по ключевым словам найти в ней соответствующий параграф, а, найдя, ознакомиться по-подробней с контекстом.

=======script.sh========================

#!/bin/bash
#
## usage: script.sh book_file key_word1 [key_word2 key_word3 ...]

awk '/'$2'/&&/'$3'/&&/'$4'/&&/'$5'/&&/'$6'/&&/'$7'/ {print NR "|" $0}' $1 | pager

#
# Найденные параграфы, содержащие искомые слова пронумерованы.
# Когда мы нашли что-то заинтересовавшее нас, мы можем, выйдя из pager'а
# ввести номер этой строки, на что получим фрагмент из исходной книги,
# начинающийся пятью строками раньше найденной строки, а заканчивающийся
# пятью строками после найденной строки
#

echo -----------------------
echo Какой вариант раскрыть подробней?; read NUM
cat $1 | sed -n ''$(($NUM-5))','$(($NUM+5))'p' | pager

==============================================

а какие еще есть способы сделать то же самое?
Monday, March 23rd, 2009
2:25 pm
[grohman]
Сверяем хостнеймы с днс-записями
В моей сети все получают ip по dhcp, а виндовые хостнеймы должны соответствовать записям в dns (в моем случае это фамилия юзера транслитом). К несчастью, иногда не все хосты соответствую этому стандарту. Для нахождения таких хостов я использую вот этот скрипт, запуская кроном раз в пять минут.

Read more...Collapse )
Wednesday, February 25th, 2009
2:05 pm
[io3s]
At
Кто-нибудь знает, очереди в аргументе команды at являются независимыми?

То есть реально ли добавить в очередь K пять команд, чтобы они выполнялись последовательно, и в очередь N так же 5 команд, чтобы две очереди работали независимо друг от друга?
Saturday, November 8th, 2008
2:53 pm
[marchello]
передергиваем клиент DHCP, если нет пинга
Привет.
Есть такой полезняк:

/sbin/ping -q -c4 -i0.01 -W1 | /usr/bin/grep "100.0%"|| echo "inet down "`date +%Y-%m-%d-%H-%M-%S` >>/var/log/inetdown.log

(пингует днс провайдера и если нет коннекта, то выводит ругню в лог)

Нужно развить мысль, а именно - чтобы кроме писАния в лог еще выполнялось

# killall dhcpcd
и
# dhcpcd eth1
но! только если нет пинга.

Подскажите, а то я новичок и пока что совсем не чувствую вопроса.
Спасибо.
Monday, September 1st, 2008
2:23 pm
[paul_z]
Passing arguments by pipe
Извините, пожалуйста.

Похоже я рискую прославится тем что задаю тут какие-то странно-глупые вопросы.
Но... в общем у меня опять странно глупый вопрос, на который я не найду ответа.

Пишем меленький скрипт, который просто печатает количество переданных ему аргументов
Read more...Collapse )
Wednesday, August 27th, 2008
1:55 am
[grohman]
MyICQbot
У всех ли есть внешний ip-адрес? Все ли могут, сидя на работе/в университете/где угодно скачивать на свой домашний ПК какие-либо файлы? Предположим, вам известен url фильма который вы хотели бы вечером посмотреть у себя дома. Но кому бы захотелось придя домой его скачивать, а не сразу смотреть? :)
Подобных примеров можно придумать очень много. Особенно, если нету внешнего ip-адреса (привет пользователям стрима;-) ).
Дабы решить эту вселенскую несправедливость, было решено написать icq-бота, который мог бы скачивать файлы на тот хост, на котором запущен. В качестве языка написания был выбран perl, потому как 1) для него уже существует Net::OSCAR.
2) За основу нашего бота был взят бот drmist'а написанный на perl %)



Очевидно, что возможностей модернизации здесь крайне много.
Но всех мыслей в голове не удержишь (ну да, я тоже подумал об icq2ssh, наверное было бы забавно), хочется узнать ваше мнение и предложения по улучшению бота. Предложения с примерами кода категорически приветствуются.
Tuesday, August 26th, 2008
11:44 pm
[v_rozouvan]
splitfd - автоматическая раскидка большого количества фаилов по каталогам
у вас было когда ни будь желание разделить несколько тысяч разно-именованых фаилов, в директории. скажем по 100 или 200 фаилов в каждой?

Так вот:

$ splitfd -s /home/user/10000_files -t /home/user/temp -p new_ -n 200

сделает примерно 50 директорий (new_01, new_02, ...) в /home/user/temp,  в которых будут лежать те 10000 фаилов из каталога /home/user/10000_files

splitfd

PS: как обычно, я не проверил если уже есть утилита которая именно это может делать ;)
Wednesday, August 20th, 2008
10:35 pm
[v_rozouvan]
apt_search
Мой скрипт для поиска Debian пакетов. Быстрый, верный, и удобный ;)
Что бы заработал, сначало запустите apt_search_update.

http://www.freewebs.com/rozouvan/scripts/apt%5Fsearch
http://www.freewebs.com/rozouvan/scripts/apt%5Fsearch%5Fupdate

Отсюда:
http://v-rozouvan.livejournal.com/2008/08/19/
Thursday, July 31st, 2008
1:10 am
[djakov]
Подскажите кто знает
Может быть задаю странный вопрос но всё же, можно ли в Xcode 3.1 писать bash скрипты и прикручивать к ним gui и потом собирать это дело как standalone приложение?
[ << Previous 20 ]
About LiveJournal.com