PostgreSQL coub express.js freeware git jquery laravel links linux macos mysql node.js php powershell python ubuntu vim virtualbox анекдот блог игры интересно стихи цитаты

Писался на коленке при помощи гугла. Цель была зарезервировать список папок и список БД mysql с одного хоста.

#!/bin/bash
##################### config
dirs_to_save="/home/ci1.loc /home/smarty /home/TTT"
my_dir_for_backups="/home/captain/backups"
mysql_databases_to_save="content mysql test"
mysql_user_name="root"
##################### /config
target_dir=`date +%F`
backup_dir="$my_dir_for_backups/$target_dir/"
echo "
-------------------------------------------------------------------
ijin reserv_copy script v.1.1 | Wed 02 Sep 2009 02:53:30 PM MSD
hello at: "`date`"
i'll save dump to: "$backup_dir"
-------------------------------------------------------------------
"
# create dir for current dump
mkdir -p $backup_dir
echo "dumping directories: 
--------------------"
# pack all src dirs
for cur_dir in $dirs_to_save; do
   dst_file=${cur_dir//\//-} # change slashes to -
   dst_file=$backup_dir${dst_file/-/}".tar.gz" # remove first - and create full dst file name
   echo $cur_dir" -> "$dst_file 
   tar -czf $dst_file $cur_dir &> /dev/null # no output from tar
done
read -s -p "
enter pass for mysql please: " MYSQL_PASS
echo "
dumping databases: 
------------------"
# pack all src databases
for cur_db in $mysql_databases_to_save; do
    dst_file=$backup_dir$cur_db".sql"
    echo $cur_db" -> "$dst_file 
    mysqldump -u $mysql_user_name --password=$MYSQL_PASS $cur_db > $dst_file 2> /dev/null ### hide error messages
    if [ $? != 0 ] ### result of execution of mysqldump
    then
        echo "=> WARNING: can't dump database. Check login:pass and privileges."
        unlink $dst_file
    else
        echo "=> OK: "$cur_db" dumped ok. I'll gzip it now.."
        gzip $dst_file
    fi
done
echo "
-------------------------------------------------------------------
all done.
bye at: "`date`"

"
sleep 1
Естественно прав на папки и базы у пользователей должно хватать. Вывод будет примерно такой:
bash script


Как? Погуглив... Нашел. Оказалось совсем несложно, как обычно..

# для директорий используем -type d 
cd
/home/target_dir
find
. -type d -exec chmod 755 {} \;  

# для файлов -type f

cd /home/target_dir
find
. -type f -exec chmod 644 {} \;  

# по маске имени с параметром -name
cd
/home/target_dir
find
. -type f -name '*.htm*' -exec chmod 644 {} \;  

# для наглядности можно выполнить

find
/home/target_dir/ -type f -name '*.php' -exec echo '-- '{} \;
Хороший человек объяснил подробности. ";" - терминатор екзека и шелла одновременно, поэтому его в шелле надо заэксейпить. Ну а "{}" результат файнда построчно.


Для примера посчитаем файлы и папки в каталоге:

ls -1 /home | wc -l
cat 123.txt | wc -l


Например надо постранично посмотреть вывод той же самой du. Как? less

cd /
sudo du -h | less
Кстати, посмотреть общий размер каталога в линукс можно вот так du -hs /home/myhome


Случилась тут такая фигня. Выделил я под виртуальную машину всего ничего - 8Гб. И жил там себе и радовался. А тут на тебе, работы как привалило и внезапно я ощутил боль от такого вот опрометчивого шага. А сам VirtualBox как-то не разрешает динамически взять так и хопа сделать виртуальный хард больше. Оно и понятно, гостевая операционка с ума сойдет от таких поворотов. И решил я создать ещё один виртуальный хард и присоединить его к своей виртуалке и всё самое толстое (своё барахло по работе, базы мускульные, тонны дампов софта и тп лабудень) перенести на этот новый хард. Ну вот отрезал я значит ещё 20Гб, перезапустил виртуалку ии.. Само собой ничего автоматом не подхватилось. Поскольку в настройке линукса я новичек практически, пошел я гуглить. Ну и нагуглил ссылочку раз (как прицепить новый хард) и ссылочку два (как его отформатировать). В общем очень интересно было покрутить мозгами в ночи и постучать в бубен чуток :) Вот что примерно пришлось проделать.

sudo fdisk -l
/*
хм.. диск есть в системе. это круто. но на нем непонятная файловая система и нету разделов. 
кстати разделы можно посмотреть командой ls /dev/disk/by-uuid например, 
там ещё можно по-другому поглядеть, смотрим ls /dev/disk/
ну чо дальше.. ну думаю форматну-ка я его.
*/
sudo mkfs.ext3 /dev/sdb
sudo fdisk -l

/*
о, круто, больше на разметку диска не ругается
теперь значит можно раздел создать (я наоборот сделал, надо было сначала 
раздел а потом форматировать, но и так тоже работает как ни странно)
*/
sudo fdisk /dev/sdb

/*
тут мастер меня поспрашивал чего я хочу, я захотел один первичный 
раздел со всеми дефолтными настройками
*/
sudo fdisk -l

/*
ну что, всё круто. никаких матюгов уже не видно. премонтировать чтоли надо теперь.
*/
cd /home
sudo mkdir disk2
sudo mount /dev/sdb /home/diks2
cd /home/disk2
ls -la

/*
ура. примонтировано. lost+found папку видно. отлично.
ну теперь вроде как всё просто. надо дать себе на эту папку прав, бросить 
линк на неё в хомяк для удобства (моего) и радостно переложить туда всё своё барахло.
*/
sudo mkdir web
sudo chown ijin:ijin web
cd ~
ln -s /home/disk2/web

/*
во. теперь /home/ijin/web -> /home/disk2/web
всё. в конфигах апача поправил пути
ну и всё. смотрю свободное место..
*/
df -h

/*
и вижу что на первом диске весь этот секс освободил мне каких-то 800 МБ всего-то. 
так, думаю.. вот хренота. ещё пару жирненьких дампов в БД волью и привет. 
Надож как-то всё жирное унести .. минут 5 пытаюсь руками найти где лежат мускульные базы. 
ищу вручную найти не могу. вспоминаю про волшебную утилитку du. делаю значит..
*/
cd /
sudo du -h | grep mysql

/*
rem: sudo - чтобы ходить по всем-всем папкам, даже тем в которые у моего юзера нет доступа.
и вижу ацкий поток строк. смотрю на строчки которые du отдает (хорошо уже глазки привыкли 
на всё подряд регулярные выражения примерять :) и вижу, что указанный размер в Гб можно 
легко выловить из этого потока шлака. у grep есть клёви ключик -r, который позволяет не тупо 
искать подстроку а искать строчку совпадающую с регулярным выражением.
*/
cd /
sudo du -h | grep -r .*G.*mysql.*

/*
и вот они искомые обожравшиеся папки :) везение конечно чистой воды, наверняка есть
способ проще узнать где лежат мускульные базы, или просто нефигово бы знать где они 
лежат.. но в общем вот так вот при помощи кувалды и какой-то матери :) пришли к нужному 
результату. как говорил товарищ Христос "ищите и обрящите" (с) =)
*/
du disk usage

/*
теперь наверное осталось закрепить успех в /etc/fstab
для чего исполняем
*/
sudo mcedit /etc/fstab

/*
и в нем по аналогии с "UUID=бебебе / бебебе"  (это подключение основного раздела 
первого диска по UUID я так понимаю) прописываем
/dev/sdb /home/disk2 бебебе как в оригинальной строке хвост про ext3 и ещё какая-то "лабуда"
это надо затем чтобы после каждой перезагрузки не приходилось обламываться от того что 
второй диск не подключен и при загрузке демоны которые с него почитать хотят страшными 
словами ругаются, кроме того.. ну к нему тупо не будет доступа пока не скажешь
*/
sudo mount /dev/sdb /home/disk2

/*
в общем вот так должно быть примерно в фстабе
*/

Ну дальше понятно, упер базы на другой диск. Вот такая вот карусель. Чем больше калупаюсь с линуксом тем больше он мне нравится. Там всё можно сделать миллионом разных способов. Границ практически нет. Космические знания не нужны - под рукой всегда есть man и гугл. Только желание по сути. Я ещё хотел как-то написать про настройку сети в VirtualBox при том что ноут у меня ходит в сеть не по проводу, а через вайфай роутер, и одним коннектом на инет не обойтись, так как при таком раскледе на виртуалку не зайти, и надо было ещё один сетевой интерфейс поднимать, но это.. как говорится, совсем другая история :) Удачи вам. In byte we trust ;)

P.P.S.: да, при переносе баз в другое место я огреб уже известную с 8.04 проблему с apparmor. Фиксится это просто:
sudo mcedit /etc/apparmor.d/usr.sbin.mysqld

# меняем путь в строках
# /var/lib/mysql/ r,
# /var/lib/mysql/** rwk,
# на свой
# /home/disk2/mysql_db/ r,
# /home/disk2/mysql_db/** rwk,

sudo /etc/init.d/apparmor restart
sudo /etc/init.d/mysql restart

# взлёт. 5 минут полет нормальный. =)
# права на папки 755, на файлы 660
# пользователь и группа на всё mysql:mysql


aghr